开始看这道题,先想到的是存储所有数字和出现的次数然后找到唯一的那个数字。
接着想到可以先排序,比较一下奇偶是否相等,于是有了这样的解法
public int singleNumber(int[] nums) {
Arrays.sort(nums);
int n = nums.length -1;
for(int i = 0; i < n; i+= 2){
if( nums[i] != nums[i+1]) return nums[i];
}
return nums.length%2 == 0 ? 0 : nums[n];
}
可是仔细回忆,总觉得还有最理想的方法,毕竟在找对称数字字符串的时候有用到二进制数字的32个位标志(a -> z)字母是否出现过。最后搜索了一下其他二进制的算法和参考了大家分享,才知道想起还有异或运算。不得不提醒,int在java里面是用32位二进制表示的。 基础类型转换参考
public int singleNumber(int[] nums) {
int x = 0;
for(int i:nums) x ^= i;
return x;
}
说到这里,必须要复习一下二进制数的基本运算了。
//或
1010 & 0101 == 0000
1100 & 0110 == 0100
//与
1010 | 0101 == 1111
1100 | 0110 == 1110
//取反
~1111 == 0000
~0011 == 1100
//异或(相同得1,不同得0)
1010 ^ 0101 == 1111
1100 ^ 0110 == 1010