[LeetCode] 一些位操作类的算法

Posted 嗡汤圆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 一些位操作类的算法相关的知识,希望对你有一定的参考价值。

1. 出处

找列表中唯一出现一次的元素
汉明重量/数1出现的次数
汉明距离

2. 说明

2.1 基本规则

从二进制数开始分析有一些有趣的基本操作:

  • 乘2: 右移动1位
  • 除2: 左移1位
  • 0 & 0 = 0, 1 & 0 = 0, 1 & 1 = 0,这个用来处理数1出现的位数,后边会写
  • 0 ^ 0 = 0, 1 ^ 0 = 1, 1 ^ 1 = 0 ,只要位不相同就为1,这里用来数唯一出现的数字
  • java中的Integer是32位有符号整数,因此100000000…..0 = -2147483648 即 Integer.MIN_VALUE
  • Integer 的1000000….0 继续左移动以为则为0。
  • Integer.MIN_VALUE = 100000….00 而 Integer.MAX_VALUE = 0111111….111 因此快速获得 Integer.MAX_VALUE = (1 << 31) -1

2.2 技巧

2.2.1 唯一出现一次的元素

因为异或操作的特性,任何数异或0都是自己,自己异或自己就是0。因此对一个列表用0异或第一个元素,然后逐次向下异或即可得到唯一出现的元素了。

class Solution 
    public int singleNumber(int[] nums) 
        if(nums.length==1) 
            return nums[0];
         else 
            int initNum = 0;
            for(int num: nums) 
                initNum ^= num;
            
            return initNum;
        
    

2.2.2 汉明重量

通过1作为游标进行与运算,当1出现的位置与游标重合时,与的结果不为0。

public class HammingWeight 

    public int hammingWeight(long n) 
        int tag = 1;
        int count = 0;
        while (tag != 0) //由于int类型的函数是32位因此要循环32次
            if ((n & tag) != 0)
                count++;
            tag = tag << 1;

        
        return count;
    

2.2.3 汉明距离

找出不相同的位数量,在2.2.2 的基础上,将两数做一次异或运算就变成了2.2.2的题目了~~~

public class HammingDistance 
    public int hammingDistance(int x, int y) 
        int dif = (x ^ y);
        int tag = 1;
        int count = 0;
        while (tag != 0) //由于int类型的函数是32位因此要循环32次
            if ((dif & tag) != 0)
                count++;
            tag = tag << 1;

        
        return count;
    

2.2.4 其它技巧

  • 判断是否是偶数: n & 1 == 1
  • 不用临时变量交换两个数的位置: a ^= b; b ^= a; a ^= b;
  • 判断符号是否相同: (x ^ y) >= 0;
  • -

以上是关于[LeetCode] 一些位操作类的算法的主要内容,如果未能解决你的问题,请参考以下文章

leetcode刷题——一些算法技巧总结2.0

Leetcode 191.位1的个数 By Python

Leetcode刷题100天—191. 位1的个数( 数学)—day92

Leetcode刷题100天—191. 位1的个数( 数学)—day92

Leetcode刷题100天—191. 位1的个数( 数学)—day92

信息安全-4:公钥密码体制之背包算法[原创]