import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
public class SingleNumber {
//方法一:暴力破解
public int singleNumber1(int[] nums) {
int result = nums[0];
for (int i = 0; i <nums.length ; i++) {
boolean flag = true;
for (int j = 0; j <nums.length ; j++) {
//不与自身比较
if(i==j){
continue;
}
if(nums[i]==nums[j]){
flag = false;
break;
}
}
if(flag){
result = nums[i];
}
}
return result;
}
//方法二:暴力法
public int singleNumber2(int[] nums) {
//定义一个列表,保存当前所有出现过一次的元素
ArrayList<Integer> singleNumList = new ArrayList<>();
//遍历所有元素
for (Integer num:nums) {
if(singleNumList.contains(num)){
//如果已经出现过,删除列表中的元素
singleNumList.remove(num);
}else {
//没有出现过,直接保存
singleNumList.add(num);
}
}
return singleNumList.get(0);
}
//方法三:保存单独的元素到hashMap
public int singleNumber3(int[] nums) {
HashMap<Integer, Integer> singleNumMap = new HashMap<>();
for (Integer num:nums) {
if(singleNumMap.get(num)!=null){
singleNumMap.remove(num);
}else {
singleNumMap.put(num,1);
}
}
return singleNumMap.keySet().iterator().next();
}
//方法四:用set去重,然后加所有数,乘2,减去一开始的数组和(数学解法)
public int singleNumber4(int[] nums) {
//定义一个hashset进行去重
HashSet<Integer> set = new HashSet<>();
int arraySum = 0;
int setSum = 0;
//1.遍历数组元素,保存到set中,并直接求和
for (Integer num:nums) {
set.add(num);
arraySum+=num;
}
//2.集合所有元素求和
for (int num:set) {
setSum+=num;
}
//3.计算结果
int result = setSum*2-arraySum;
return result;
}
//方法五:数学方法(异或),任意数与自己异或得到0,0与任意数异或得到任意数,思路:所有数进行异或,异或是满***换律和结合律
public int singleNumber(int[] nums) {
//最后的异或结果
int result = 0;
//遍历所有数据,按位异或
for (int num:nums) {
result ^= num;
}
return result;
}
public static void main(String[] args) {
SingleNumber singleNumber = new SingleNumber();
int[] arr ={2,2,1};
System.out.println(singleNumber.singleNumber(arr));
}
}