这道题肯定是利用位运算,但是不能使用异或;这里让我们一起回忆一下以前常见的题;注意;按位异或满足交换律-自己与自己异或为0。
1.给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
class Solution {
public static int singleNumber(int[] nums) {
int result=0;
for(int i=0;i<nums.length;i++){
result^=nums[i];
}
return result;
}
}
2.
思路详解
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr intvector
* @param k int
* @return int
*/
// 每个二进制位求和,如果某个二进制位不能被k整除,那么只出现一次的那个数字在这个二进制位上为1。
int foundOnceNumber(vector<int>& arr, int k) {
int binarySum[32];
for(int i = 0; i< 32; i++){//求每个二进制位的和
int sum = 0;
for(int num : arr){ //c++可以使用java一样的for循环进阶
sum += (num >>i & 1);//依次右移num,同1相与,计算每一位上1的个数
}
binarySum[i] = sum;
}
int res = 0;
for(int i = 0; i< 32; i++){
if(binarySum[i]%k!=0){
res += 1<<i;//左移恢复 根据优先级,先二进制末位加1再左移i个单位实现恢复
}
}
return res;
}
};