采用按位操作一个 while 循环解决问题。但是要注意特殊情况 num = 1 时的处理 ~
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num = in.nextInt();
// 最大连续数
int max = 0;
// 计数器
int count = 0;
while(num > 0){
/*
这里有个坑点,就是数字 3 这种,二进制表示是 11
8 4 2 1
-----------
0 0 1 1 = 3
在进行循环的时候,因为如果向右移位后变为了 1 ,就无法再计数了
所以要对 1 的时候做一个特殊处理。
小弟不才只能想到这种 low 办法了...
如果 num == 1,说明是最后一位了,需要判断以下计数器是否大于 0
如果大于 0 说明还在连续状态上,则计数器加 1,count++
否则则不是连续的状态(因为如果中间断开,count会置为0)
不连续状态就直接把 count 置为 1,再去和 max 比较取大值
*/
if(num == 1) {
if(count > 0) {
count ++;
} else {
count = 1;
}
if(count > max) {
max = count;
}
}
// 如果当前 num 和 1 进行按位与操作得 1,说明此位置是 1,计数器累加
// 否则就要判断当前这个 count 和 max 比较,谁大取谁,注意要把计数器清空为 0
if((num & 1) == 1) {
count ++ ;
} else {
if(count > 0) {
if (count > max) {
max = count;
}
count = 0;
}
}
// 无符号右移 1 位
num = num >>> 1;
}
System.out.println(max);
}
}

京公网安备 11010502036488号