剑指offer-位运算

剑指 Offer 15. 二进制中1的个数

  • 思路:
  1. 做与运算,如:(11)&(10) = (10),那么就是将3&2=2,只有两个位都为1的时候,结果才为1.
  2. 采用与运算就可以不断缩小问题的大小,直到0;
  • 代码:
public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int res = 0;
        while(n!=0){
            n = n & (n - 1);
            res++;
        }
        return res;
    }
}

剑指 Offer 56 - I. 数组中数字出现的次数

  • 思路:
    详细题解
    在这里插入图片描述
    通过上图很明显的能说明解析步骤,这里只对步骤2进行一个个人理解分析:

第一步进行异或操作完了之后,那么就是1^6,此时如何将两个数分开?
那么可以根据与某个数的&运算结果的不同将第一步得到的数划分成两个结果,那么和谁&?
那么,只需要根据第一次异或运算的结果,找到某一位是不一样的即可,那么,即:使用1 & (第一次异或结果),本例使用的是找1,即找到某一位二进制位是1的地方,然后以此进行划分,对原数组。

  • 代码:
class Solution {
    public int[] singleNumbers(int[] nums) {
        int x = 0, y = 0, n = 0, m = 1;
        for(int num : nums){
            n ^= num;
        }
        while((n & m) == 0){
            m <<= 1;
        }
        for(int num : nums){
            if((num & m) != 0){
                x ^= num;
            }
            else {
                y ^= num;
            }
        }
        return new int[]{x, y};
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值