剑指 Offer 15. 二进制中1的个数(191. 位1的个数)
题目:
思路:
【1】由于输入的是int整数,那么其实并不一定要使用函数转成二进制的字符串,通过位移的方式一样可以达到像二进制一样的判断,但这里会有些问题,因为位移存在,左位移和右位移,首先左移的话是存在向末尾补0的操作,而右移的话,如果是正数,是会在高位补0,而负数则会补1。但基于条件给定正数,故都可以。
【2】消除二进制末尾的 1 的方法 【 n & (n - 1)
】(这种无疑是最优的,有多少个1就循环多少次),原理:
代码展示:
//时间0 ms击败100% //内存38.3 MB击败90.47% //时间复杂度:O(k),其中 k 是 int 型的二进制位数,k=32。我们需要检查 n 的二进制位的每一位,一共需要检查 32 位。 //空间复杂度:O(1),我们只需要常数的空间保存若干变量 public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int count = 0; for (int i = 0; i < 32; i++){ if (((n >> i) & 1) == 1) count++; } return count; } } //时间0 ms击败100% //内存38.3 MB击败91.58% public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int ret = 0; while (n != 0) { n &= n - 1; ret++; } return ret; } }