Day 92
题目描述

思路
初次思路 :想不出来 哈哈哈指挥hash 就不放出来丢人了
题解思路 :这个做法是每次确定一个位是否为答案为1 的位
具体是这样的:由于除了答案外每个数字都会出现3次,那么我们不考虑答案的情况,那么一个二进制位的可能为0或者1,将所有数组中(排除答案)在这个位的值相加必然是3的倍数 ,二进制位为0无所谓
基于这点,如果某个位数不是3的倍数,是不是就说明答案在这个位是1,于是有了以下做法
java
class Solution {
public int singleNumber(int[] nums) {
int ans = 0;//存放结果
for (int i = 0; i < 32; ++i) {
int total = 0;//记录该二进制位的值之和
for (int num: nums) {
total += ((num >> i) & 1);//右移后取最低位(即为i循环的这位的值)
}
if (total % 3 != 0) {//如果这个位所有的值之和不是3的倍数,那么答案这位就是1
ans |= (1 << i);//那就将1左移到这位,与其进行或运算(低位全为0,或不会改变低位的结果)
}
}
return ans;
}
}