戴璞微的博客

简单点!做事的动机简单点

剑指offer--二进制中1的个数

题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示

Java代码:

public class Solution {
    public int NumberOf1(int n) {
        String binary = Integer.toBinaryString(n);
        char[] ch = binary.toCharArray();
        int cnt = 0;
        for ( int i = 0 ; i < ch.length ; i++){
            if (ch[i] == '1'){
                cnt++;
            }
        }
        return cnt;
    }
}

C++代码思路
这题有3种思路。第一种:让n与1相与后判断是否为真,若为真,计数器cnt加一并将n右移1位直至n为0。这种思路受限于n是否为正数,若n为负数,那么每次右移最高位补1而非0,那么这会导致死循环。第二种:将第一种思路反过来思考,将flag = 1与n相与,若为真,cnt++,每次将flag左移一位,那么这种解法的时间复杂度与n的2进制数的位数一样,效率不高。第三种:一个数n如果减1,那么将这个2进制数从右向左的第一个“1”变成0,若这个1不是最低位,那么之后的所有位取反,而这个1左边的所有位保持不变。那么n与n-1相与可以使从右向左的第一个1与其之后的位变成0,那么这个2进制数有几个1,只需几次上述操作即可。


C++代码:

class Solution {
    public:
        int  NumberOf1(int n) {
            int cnt = 0;
            while(n){
                cnt++;
                n = (n-1)&n;
            }
            return cnt;
        }
};
阅读更多
版权声明:本文为博主原创文章,若需转载,请注明http://blog.csdn.net/qq_30091945 https://blog.csdn.net/qq_30091945/article/details/70196923
个人分类: 面试真题在线编程
所属专栏: 剑指offer题解
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭