<位运算>LeetCode题目汇总

1.位1的个数

191.位1的个数
在这里插入图片描述
法1:String法
在这里插入图片描述

    public int hammingWeight(int n) {
        int ret = 0;
        String str = Integer.toBinaryString(n);
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '1') {
                ret++;
            }
        }
        return ret;
    }

法2:按位与运算&与移位<< >> >>>
以前在博客写过这个:
在这里插入图片描述


笔试的时候想到的是左移右移,也想到了与运算,但就没有想到它们组合起来……

    public int hammingWeight(int n) {
        int ret = 0;
        while (n != 0) {
            if ((n & 1) == 1) {
                ret++;
            } 
            n >>>= 1;
        }
        return ret;
    }

n&1经常用来n的奇偶性,是偶数则结果为0,奇数则结果为1。也可以用来获取最右边的位。

法3:改良位操作(布赖恩·克尼根算法)

    public int hammingWeight(int n) {
        int ret = 0;
        while (n != 0) {
            ret++;
            n &= (n - 1);
        }
        return ret;
    }

n&n-1作用是把最右边的1变成0

2.汉明距离

461.汉明距离
在这里插入图片描述
法1:

    public int hammingDistance(int x, int y) {
        int z = x ^ y;
        int ret = 0;
        while (z != 0) {
            ret++;
            z &= (z - 1);
        }
        return ret;
    }

法2:

    public int hammingDistance(int x, int y) {
        return Integer.bitCount(x ^ y); 
    }

3.颠倒二进制位

190. 颠倒二进制位
在这里插入图片描述
在这里插入图片描述
一开始尝试字符串解法出问题了,还是老老实实用位运算好。位运算的括号很重要,别省略掉。

    // public int reverseBits(int n) {
    //     String str = Integer.toBinaryString(n);
    //     char[] ca = str.toCharArray();
    //     int i = 0, j = str.length() - 1;
    //     while(i < j) {
    //         char tmp = ca[i];
    //         ca[i++] = ca[j];
    //         ca[j--] = tmp;
    //     }
    //     return Integer.parseInt(new String(ca));
    // }
    public int reverseBits(int n) {
        int ret = 0, len = 31;
        while (n != 0) {
            ret += (n & 1) << len--;
            n >>>= 1;
        }
        return ret;
    }

4.数字范围按位与

201.数字范围按位与
在这里插入图片描述

法1:布赖恩·克尼根算法
这个算法很有用,必须好好理解掌握。一般用while循环。

    public int rangeBitwiseAnd(int m, int n) {
        while (m < n) {
            n &= n - 1;
        }
        return n;
    }

5.只出现一次的数字

136.只出现一次的数字
在这里插入图片描述
a ^ a = 0
0 ^ a = a

    // public int singleNumber(int[] nums) {
    //     Set<Integer> set = new HashSet<>();
    //     for (int i : nums) {
    //         if (!set.add(i)) {
    //             set.remove(i);
    //         }
    //     }
    //     return set.iterator().next();
    // }
    public int singleNumber(int[] nums) {
        int res = 0;
        for (int num : nums) {
            res ^= num;
        }
        return res;
    }

6.丢失的数字

268.丢失的数字
在这里插入图片描述
法1:哈希表

    public int missingNumber(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i <= nums.length; i++)
            set.add(i);
        for (int num : nums)
            set.remove(num);
        return set.iterator().next();
    }

法2:位运算

    public int missingNumber(int[] nums) {
        int ret = nums.length;
        for (int i = 0; i < nums.length; i++) {
            ret ^= i ^ nums[i];
        }
        return ret;
    }

7.比特位计数

338.比特位计数
在这里插入图片描述
可以理解成在第1题上加个for循环。

    public int[] countBits(int num) {
        int[] nums = new int[num + 1];
        for (int i = 1; i < nums.length; i++) {
            int n = i, count = 0;
            while (n != 0) {
                n &= n - 1;
                count++;
            }
            nums[i] = count;
        }
        return nums;
    }

8.UTF-8编码验证

393.UTF-8编码验证
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用以下方法对二维向量vector<vector<int>>进行排序: 1. 使用STL中的sort函数进行排序。引用中提到了一些排序算法,比如堆排序(heap_sort),希尔排序(shell_sort),选择排序(select_sort)和快速排序(quick_sort_swap)。你可以根据需要选择其中一个算法对vector<vector<int>>进行排序。 2. 如果你想在创建二维向量时就进行排序,你可以使用引用中的方法通过vector创建二维数组,并在创建时对其中的元素进行排序。 3. 如果你已经创建了一个二维向量,你可以使用引用中的方法使用resize函数对二维向量进行重新分配,并在重新分配时对其中的元素进行排序。 无论你选择哪种方法,都可以对二维向量vector<vector<int>>进行排序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vectorstring和vectorint](https://blog.csdn.net/toCVer/article/details/122484732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [leetcode2sumc-Code-Storm2019:力密码2019](https://download.csdn.net/download/weixin_38700430/19937142)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值