191 & 剑指 Offer 15. 二进制中1的个数
Posted 沧夜2021
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了191 & 剑指 Offer 15. 二进制中1的个数相关的知识,希望对你有一定的参考价值。
来源
主站191题,剑指 Offer 15题
内容
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 ‘1’。
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。
提示:
输入必须是长度为 32 的 二进制串 。
解题过程
这题虽然是简单题,但是也很有意思
一开始我的思路是使用to_string
转为string
类再遍历查找1
计算出1
的个数。
测试时候,却发现
翻车了
于是去查 to_string - C++ Reference
发现:
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
没有 uint32_t
这个类型。
怪我不看清题意!
怪我不看清题意!
怪我不看清题意!
于是使用 1<<i
这个与原数字逻辑与,这样做的意义是:
1<<i
表示1
左移i
位,即第i
位为1
其与n
想与就得到这位是不是1
的结果。如果结果为1
则n
的这位为1
class Solution {
public:
int hammingWeight(uint32_t n) {
int ans = 0;
for (int i = 0; i < 32; i++) {
if (n & (1 << i)) {
ans++;
}
}
return ans;
}
};
后面发现力扣官方题解更快的方法:
使用n & (n-1)
,计算结果为把 n 的二进制位中的最低位的 1 变为 0 之后的结果
试想:
当n
为 001010
时,n-1
为001001
两个数相与结果为:
n 001010
&
n-1 001001
----------------
001000
上面的结果刚好把n
中最低位的1变成0
于是我们一直做n & (n-1)
运算,运算一次,n
最低位的1
就会变为0
那么运算ans
次后,n
为0
时,就是n
的二进制有ans
个1
class Solution {
public:
int hammingWeight(uint32_t n) {
int ans = 0;
while (n) {
n &= n - 1;
ans++;
}
return ans;
}
};
总结
本题两个知识点:
1<<i
表示1
左移i
位,即第i
位为1
n & (n-1)
,计算结果为把 n 的二进制位中的最低位的 1 变为 0 之后的结果
以上是关于191 & 剑指 Offer 15. 二进制中1的个数的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode---剑指Offer题15---二进制中1的个数