这道题可以使用字符串分割解决,但是是取巧的方式,不推荐。根据这道题考的知识点出发去解决,解题过程可以学到很多相关技巧。
思路:
首先我们需要掌握二进制“有符号右移”“无符号右移”知识,去相关博客搜索,半个小时就能学会。考虑到输入可能会有负数,负数二进制右移高位补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);
}
}



京公网安备 11010502036488号