LeetCode 338. Counting Bits


Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1’s in their binary representation and return them as an array.

大意为在给定的一个数字,求对于每一个小于这个数字的非负整数的二进制形式中有多少 1。

思路

在二进制运算中有一个基本但是神奇的运算 & ,与运算的原则是同为 1 相与则为 1,一旦有 0 相与则为 0,

因此在位运算中有一个神奇的规律,当一个正整数数 x 与 (x-1) 相与时,x 二进制中的最右端的 1 则会消去

如:

010010101
&
010010100
=
010010100


010100100
&
010100011
=
010100000

由此规律可知,当一个数 x 与 (x-1) 相与多次,直到结果为 0,则相与次数则为 x 二进制中 1 的个数

代码

public int[] countBits(int num) {
    int[] ret = new int[num + 1];
    for (int i = 0; i <= num; i++) {
    	int tmp = i;
    	while (tmp > 0) {
            tmp = tmp & (tmp - 1);
            ret[i]++;
    	}
    }
    return ret;
}

评论
 上一篇
LeetCode 136. Single Number LeetCode 136. Single Number
Given an array of integers, every element appears twice except for one. Find that single one. 大意为给定一个整数数组,数组中除了一个元素只有一个外
2016-07-28
下一篇 
关于异或^ 关于异或^
异或为相同为 0 相异为 1
2016-07-27 Timeliar
  目录