算法
看每一位1的数量
C++ 代码
class Solution {
public:
int findNumberAppearingOnce(vector<int>& nums) {
int ans = 0;
for (int i = 31; i >= 0; --i) {
int cnt = 0;
for (int x: nums) {
if (x >> i & 1) {
cnt ++;
}
}
if (cnt % 3 == 1) {
ans = (ans * 2) + 1;
}
else {
ans = ans * 2;
}
}
return ans;
}
};
那你这个就是O(nlogn)时间复杂度了
外层循环是常数,还是O(n)吧
秀
能讲一讲算法思想吗,只看代码看不透
int 共32位,统计在每一位上 1 出现的次数,如果数是重复 3 次的,相应位上 1 的个数模 3 肯定为 0,如果模 3 为 1 ,一定是那个只出现一次的数留下的,用所有 1 出现的二进制位恢复那个只出现一次的数就好了。
秀
妙哉!
判断可写成一句:ans = (ans << 1) + (cnt % 3);
大神这句怎么解释? ans和cnt的关系
ans总是需要乘以2倍的,但是cnt如果是奇数的话那么cnt%3就是+ 1,如果是偶数的话那么 + 0
nb
orz
妙
厉害的
OTZ,这个思想很巧妙