0
点赞
收藏
分享

微信扫一扫

创建节约机关怎样向媒体投稿报道宣传?

Mezereon 2024-06-13 阅读 2

1. & 和 | 的基本操作

137. 只出现一次的数字 II - 力扣(LeetCode)

先对位运算的操作进行复习:

1、>> 右移操作符

2. << 左移操作符

 注意,所有的操作符只能移动整数。

3. & 和 |

& //按位与
| //按位或

&:两位数都为1时为1,其余时候为0

|  :  两位数只要有一个为1,就为1,其余时候为0

并且,| ^ &的优先级都是低于==和!=的, 需要判断语句时记得加括号

意义


有了以上铺垫,我们再学习思路:

答案:

int singleNumber(vector<int>& nums) {
        int ans = 0;
        for (int i = 0; i < 32; ++i) {
            int x = 0;
            for (int j = 0; j < nums.size(); ++j) {
                x += (nums[j] >> i) & 1;
            }
            if (x % 3) {
                ans |= (1 << i);
            }
        }
        return ans;
    }


 2.小试牛刀

136. 只出现一次的数字 - 力扣(LeetCode)

 

依然是找出只出现一次的数据,不过按位异或就可以了

 int singleNumber(vector<int>& nums) {
        int ans=0;
        for(auto e:nums){
            ans^=e;
        }
        return ans;
    }


3.位运算 x & -x 来获取x的lowbit(取出二进制下X最低位的1)

       我们可以认为x &-x是一种取得最低位1的技巧,并且这个用法对负数也凑效。

来个大的:

260. 只出现一次的数字 III - 力扣(LeetCode)

                    

分开的方法:

 我们处理如下:

会在x处出现-2^31次方的,答案一定是0和-2^31,否则x不会等于-2^31

并且在下文中,0和-2^31也的确会分开,因此达到目的。

各位都是工科生,仔细想想按位异或的最后一步就明白了。

举报

相关推荐

0 条评论