牛客网刷题之二进制中1的个数

来源:互联网 发布:表白软件手机版 编辑:程序博客网 时间:2024/04/29 22:42

题目描述:

这里写图片描述

解题思路:

  一开始想到的是除二取余法,可是题目给的int类型的,并不能通过测试;然后,显然就是位与运算了,每次先与0X01进行与操作,若非0,则计数器加1,然后向右移1位,循环这个过程。

public int NumberOf1(int n) {        int sum = 0;        while(n != 0){            sum += n & 0x01;            n >>= 1;        }        return sum;    }

  然而却被判运行超时了,原来这种方法循环次数始终为8,测试里弄一个比较大的数就卡住时间了;那又只能另辟出路了。
  如果一个数不为0,那么二进制表示的话就至少有一个是1,如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。例如11100(28),减1得到11011,将得到的数再和原来的整数做&运算,将得到11000,以此类推,有多少个1就可以进行多少次这种运算。

题解:

public int NumberOf1(int n) {        int sum = 0;        while(n != 0){        n &= (n-1);        sum ++;        }        return sum;    }

ac结果:

这里写图片描述

0 0
原创粉丝点击