Single NumberI
java
分析:这道题应该是很简单了,直接使用异或运算,把重复出现的数字消掉剩下的就是出现一次的元素数组
lass Solution { public int singleNumber(int[] nums) { int tmp = nums[0]; for(int i = 1;i < nums.length;i++){ tmp = tmp ^ nums[i]; } return tmp; } }
Single NumberII
ide
分析:这种题型能够概括为一个数组中的元素某一元素只出现了K次,而其余元素均出现了M次,而后求出出现K次的元素问题。若是Kspa
为奇数M为偶数,就跟上面第一题是同样的处理方式了;而其余状况则须要考虑使用位运算。咱们知道,每一个数字的二进制表示是必定的,因此咱们经过计算每一位中1的个数,而后除3,若余数为0说明该位上为1的数都出现了三次,若余数不为0,说明咱们要找的那个数字该位为1,经过移位运算实现上述过程。同理,若题目要求其余元素均出现了5次,就除5。it
class Solution { public int singleNumber(int[] nums) { int ans = 0; for(int i = 0 ; i < 32 ; i++){ int sum = 0; for(int j = 0 ; j < nums.length ; j++){ if(((nums[j] >> i) & 1) == 1 ){ sum++; sum %= 3; } } if(sum != 0){ ans |= sum << i;//将循环中右移的位移回原位置 } } return ans; }
Single NumberIIIio
分析:数组中的无关元素出现了偶数次,因此先考虑用异或将它们消除,获得3和5的异或结果。而后咱们考虑如何将3和5分离:3(011)和5(101)异或的结果为6(110),咱们须要先找到3和5的二进制表示中不相同的一位,这里的方法就是6与-6进行相与,即110与其补码(取反加一)011相与,获得010(即从右往左3和5的第二位不一样),咱们姑且将它称为分离因子。而后遍历整个数组,每一个数与该分离因子相与可将数组分为&x==0和&x!=0的两组,而后在每组内部进行异或运算,获得结果。
class
class Solution { public int[] singleNumber(int[] nums) { int diff = 0; for(int num : nums) { diff ^= num; } diff &= -diff; int[] res = new int[]{0,0}; for(int i : nums) { if((diff & i) == 0) { res[0] ^= i; } if((diff & i) != 0) { res[1] ^= i; } } return res; } }