美文网首页
333.Counting Bits,理解位运算

333.Counting Bits,理解位运算

作者: 一个理想主义的大兵 | 来源:发表于2019-06-23 14:07 被阅读0次

本题考查对位运算的理解,自己想出的思路,有点骄傲

class Solution {
    public int[] countBits(int num) {
        int[] ret = new int[num + 1];
        ret[0] = 0;
        for(int i = 1; i <= num; i++){
                ret[i] = ret[i & (i - 1)] + 1;
        }
        return ret;
    }
}
  • 首先是找规律,通过画图,并尝试使用位运算,找到相关性
  • 不是一道典型的DP,但借鉴其思想
  • ret[i] = ret[i & (i - 1)] + 1,这是核心逻辑,理解如下:
    • 两个连续的数字,后一位是由前一位加1得到的,比如:6 = 5 + 18 = 7 + 1

    • 十进制的加1操作,从二进制的角度理解,有两点:

      1. 从低位到高位,遇到的第一个0会变成1 (后续表述中的第一个0,都是从低位算起的第一个0)

      2. 这个0右边的1,会变成0

        比如:1010 -> 1011, 1001 -> 1010, 01111 -> 10000

    • 当连续的两个数字,做与操作时,对于较小的那个:

      • 第一个0左边(高位)的二进制是相同的,右边(包括0本身)完全不同

        比如:5: 1001, 6:1010,前两位相同,后两位不同

      • 操作流程:左边完全保留 -> 0变成1 -> 右边都变成0 (如果右边有二进制)

    • 回到本题,求1的个数:

      • 与操作后,得到左边的公共二进制,取到对应1的个数(DP思想,利用之前计算后的结果,减少计算)
      • 在这个基础上加1 (第一个0要变成1),就是最终1的个数

相关文章

  • 333.Counting Bits,理解位运算

    本题考查对位运算的理解,自己想出的思路,有点骄傲 首先是找规律,通过画图,并尝试使用位运算,找到相关性 不是一道典...

  • Kotlin 位运算符 , >>与>>>区别

    运算符表示含义and(bits)按位与or(bits)按位或inv(bits)按位非xor(bits)按位异或sh...

  • Kotlin 基本类型 的简单了解

    运算 shl(bits) – 有符号左移 (Java 的 <<)shr(bits) – 有符号右移 (Java 的...

  • 位运算 理解

    位运算的目的 位运算举例 位运算进一步理解 PS: 以上全部来源于:【程序员修炼之道】书中。

  • 蒙哥马利乘法原理

    引子 加密算法中,有很多大数(256bits~2048bits)的运算,基础之一便是类似于求 的值。在这个运算中...

  • Update Bits

    Update Bits 今天的题目来自LintCode,是一道关于数学和位运算的题目,难度为Medium, Acc...

  • Kotlin学习(三)——运算符

    以下是完整的位运算符(只用语Int和Long) 1.shl(bits):有符号左移 (Java 的 <<)

  • JS中的位移运算

    快速理解位运算: 位运算比其他运算(加减乘除)更加底层,所以运算的更快,但是不是所有场景都可以用 位运算只针对整数...

  • 477. Total Hamming Distance

    这道题解法很巧妙,background knowledge: int 是32为bits 与运算规则 1 & 0 =...

  • 位运算

    位运算符号 位运算符号有如下几个 &,|,^,~。接下来一个一个说下我的理解吧。 &运算符 &,与,逻辑运算的话,...

网友评论

      本文标题:333.Counting Bits,理解位运算

      本文链接:https://www.haomeiwen.com/subject/lybiqctx.html