開始看這道題,先想到的是存儲所有數(shù)字和出現(xiàn)的次數(shù)然后找到唯一的那個數(shù)字。
接著想到可以先排序,比較一下奇偶是否相等,于是有了這樣的解法
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];
}
可是仔細(xì)回憶,總覺得還有最理想的方法,畢竟在找對稱數(shù)字字符串的時候有用到二進(jìn)制數(shù)字的32個位標(biāo)志(a -> z)字母是否出現(xiàn)過。最后搜索了一下其他二進(jìn)制的算法和參考了大家分享,才知道想起還有異或運算。不得不提醒,int在java里面是用32位二進(jìn)制表示的。 基礎(chǔ)類型轉(zhuǎn)換參考
public int singleNumber(int[] nums) {
int x = 0;
for(int i:nums) x ^= i;
return x;
}
說到這里,必須要復(fù)習(xí)一下二進(jìn)制數(shù)的基本運算了。
//或
1010 & 0101 == 0000
1100 & 0110 == 0100
//與
1010 | 0101 == 1111
1100 | 0110 == 1110
//取反
~1111 == 0000
~0011 == 1100
//異或(相同得1,不同得0)
1010 ^ 0101 == 1111
1100 ^ 0110 == 1010