【剑指offer】二进制中1的个数
这个题的思路是比较简单的 大家先想一下,一个十进制整数是如何转化为二进制数的??? 我们采用的是“除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。 所以这个思路就是:和2%,看是否为1,为1,结果加1,否则继续 但是我们需要思考一下代码如何优化的问题? 如二进制是100000000000000000000,那我们需要的循环次数是多少,这个时间复杂太高,我们需要优化 所以一下均为优化过的方法 Java 1、 public class Solution { public int NumberOf1 ( int n ) { int res = 0 ; while ( n != 0 ) { n &= ( n - 1 ) ; //我将这个方法称为抹0法,将最右边的1抹掉, res ++ ; } return res ; } } 2、 public class Solution { public int NumberOf1 ( int n ) { int res = 0 ; while ( n != 0 ) { n -= n & ( ~ n + 1 ) ; //这对与方法1相似,都是将最右侧的1抹掉