这道题可以使用字符串分割解决,但是是取巧的方式,不推荐。根据这道题考的知识点出发去解决,解题过程可以学到很多相关技巧。
思路:
      首先我们需要掌握二进制“有符号右移”“无符号右移”知识,去相关博客搜索,半个小时就能学会。考虑到输入可能会有负数,负数二进制右移高位补1,会影响结果。所以我们需要使用无符号右移。我们只需要每次右移一位,然后判断右移后的二进制码末位是否为1(右移后的数&1),以下为基于二进制右移知识基础的演算过程:
假设 n=8;
1、8=(1000), (1000)&(0001)=0, n=8>>1=(100)=4
2、4=(100), (100)&(001)=0, n=4>>1=(10)=2
3、2=(10), (10)&(01)=0, n=2>>1=(1)=1
4、1=(1), (1)&(1)=1, n=1>>1=(0)=0
n=0,结束。
有了上面的演算,后面就是代码的设计了:

  • 1、使用循环对整数的二进制码进行右移1位;
  • 2、每右移一次,判断二进制末位是不是1;
  • 3、是1则二进制码1的连续出现次数+1;
  • 4、如果遇到一个0,则连续出现次数重置为0;
  • 5、用一个标识保存最大连续出现次数

完整代码:


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int n = sc.nextInt();
            int max = 0;
            int cnt = 0;
            while (n > 0) {
                if ((n & 1) == 1) {
                    cnt ++;
                    max = Math.max(max, cnt);
                } else {
                    cnt = 0;
                }
                n = n >>> 1;
            }
            System.out.println(max);
        }
    }