【位运算】Single Number I&II

single number I

这道题没毛病,利用异或^的特性,直接AC:

class Solution {
public:
    int singleNumber(int A[], int n) {
        int ans=0;
        for(int i=0;i<n;i++)
            ans = ans ^ A[i];
        return ans;
    }
};

 

Single Number II

大致思路:

之前是想要清除出现两次的位。这里是想要清除出现三次的位

记录每个bit出现的次数,一个数搞不定就加两个数,用ones来记录只出现过一次的bits,用twos来记录只出现过两次的bits,ones&twos实际上就记录了出现过三次的bits,这时候我们来模拟进行出现3次就抵消为0的操作

每次先更新twos,然后再更新ones,ones和twos要同时清除出现三次的数,最后ones中保留的就是那个仅出现一次的数(的位)。

AC代码:

class Solution {
public:
    int singleNumber(int A[], int n) {
        int ones = 0;
        int twos = 0;
        int threes = 0;
        for(int i=0;i<n;i++)
        {
            int t = A[i];
            twos |= ones&t; //twos的更新要在ones抵消出现两次的数之前。
            ones ^= t;
            threes = twos&ones; //出现三次的数
            twos &= ~threes; //用取反~ 清除出现三次的数
            ones &= ~threes;
            
        }
        return ones;
    }
};

 

 

1. 给定一个整数,将其转换为二进制表示后,返回其中位数为1的个数。 解答:使用位运算中的“与”操作符(&)和右移操作符(>>),循环判断每一位是否为1,统计个数即可。 ```python def hammingWeight(n: int) -> int: count = 0 while n != 0: count += n & 1 n = n >> 1 return count ``` 2. 给定一个整数数组,其中只有一个数出现了一次,其他数都出现了两次,找出这个只出现一次的数。 解答:使用位运算中的“异或”操作符(^),将所有数进行异或操作,最终得到的结果就是出现了一次的数。 ```python def singleNumber(nums: List[int]) -> int: res = 0 for num in nums: res ^= num return res ``` 3. 给定两个整数m和n,将其中的m位替换成n的二进制表示的后m位。 解答:使用位运算中的左移操作符(<<)和右移操作符(>>),将n的后m位左移m位,再将m的位置清零,最后进行“或”操作(|)即可。 ```python def updateBits(m: int, n: int, i: int, j: int) -> int: mask = ~0 << (j + 1) | (1 << i) - 1 m = m & mask n = n << i return m | n ``` 4. 给定一个整数,判断是否为2的幂次方。 解答:使用位运算中的“与”操作符(&),判断该数的二进制表示中是否只有一位是1,如果是,则该数为2的幂次方。 ```python def isPowerOfTwo(n: int) -> bool: return n > 0 and n & (n - 1) == 0 ``` 5. 给定一个整数,将其二进制表示中的所有0和1交换位置。 解答:使用位运算中的左移操作符(<<)、右移操作符(>>)和“异或”操作符(^),将所有0和1分别移到对应的位置上即可。 ```python def exchangeBits(num: int) -> int: return (num >> 1 & 0x55555555) | (num << 1 & 0xaaaaaaaa) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值