Skip to content

Latest commit

 

History

History
122 lines (99 loc) · 2.6 KB

File metadata and controls

122 lines (99 loc) · 2.6 KB

题目描述

输入一个整数,输出该数二进制表示中 1 的个数。

例如,将 9 表示为二进制是 1001,有 2 位是 1,因此,如果输入为 9,输出应当为 2。

样例

输入:9

输出:2

解法

解法一

利用整数 1,依次左移每次与 n 进行与运算,若结果不为0,说明这一位上数字为 1,++cnt。

此解法 i 需要左移 32 次。

不要用 n 去右移并与 1 进行与运算,因为 n 可能为负数,右移时会陷入死循环。

/**
 * @author bingo
 * @since 2018/12/17
 */

class Solution {

    /**
     * 求二进制中1的个数
     * 
     * @param n 整数
     * @return 该整数的二进制中1的个数
     */
    public int NumberOf1(int n) {
        int i = 1;
        int cnt = 0;
        while (i != 0) {
            if ((n & i) != 0) {
                ++cnt;
            }
            i <<= 1;
        }
        return cnt;
    }
}

解法二(推荐)

  • 运算 (n - 1) & n,直至 n 为 0。运算的次数即为 n 的二进制中 1 的个数。

因为 n-1 会将 n 的最右边一位 1 改为 0,如果右边还有 0,则所有 0 都会变成 1。结果与 n 进行与运算,会去除掉最右边的一个 1。

举个栗子:

若 n = 1100,
n - 1 = 1011
n & (n - 1) = 1000

即:把最右边的 1 变成了 0。

把一个整数减去 1 之后再和原来的整数做位与运算,得到的结果相当于把整数的二进制表示中最右边的 1 变成 0。很多二进制的问题都可以用这种思路解决。

/**
 * @author bingo
 * @since 2018/12/17
 */

class Solution {

    /**
     * 求二进制中1的个数
     * 
     * @param n 整数
     * @return 该整数的二进制中1的个数
     */
    public int NumberOf1(int n) {
        int cnt = 0;
        while (n != 0) {
            ++cnt;
            n &= (n - 1);
        }
        return cnt;
    }
}

解法三

利用 Java API。

/**
 * @author bingo
 * @since 2018/12/17
 */

class Solution {

    /**
     * 求二进制中1的个数
     *
     * @param n 整数
     * @return 该整数的二进制中1的个数
     */
    public int NumberOf1(int n) {
        return Integer.bitCount(n);
    }
}

测试用例

  1. 正数(包括边界值 1、0x7FFFFFFF);
  2. 负数(包括边界值 0x80000000、0xFFFFFFFF);
  3. 0。

题目导航

  1. 返回上一题
  2. 进入下一题
  3. 回到题目列表