一、题目描述
求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1。
二、输入描述
输入一个int类型数字。
三、输出描述
输出转成二进制之后连续1的个数。
四、解题思路
- 首先通过输入获取一个 int 类型的数字;
- 使用 Integer.toBinaryString(num) 将该数字转换为二进制字符串;
- 使用 split(“0”) 方法将二进制字符串按照 0 进行分割,得到连续的 1 组成的字符串数组;
- 遍历字符串数组,找到最长的连续 1 的长度;
- 输出最长连续 1 的长度。
五、Java算法源码
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()) {
int num = sc.nextInt();
// 转二进制
String binaryStr = Integer.toBinaryString(num);
// 用 0 分割
String[] strArray = binaryStr.split("0");
// 字符串长度
int result = 0;
for (int i = 0; i < strArray.length; i++) {
if (strArray[i].length() > result) {
result = strArray[i].length();
}
}
System.out.println(result);
}
}
六、效果展示
七、进阶写法
使用位运算来实现。
具体思路如下:
- 定义一个计数器 count 和一个最大长度变量 max,初值都为0;
- 遍历给定数字的二进制表示中的每一位,如果该位为 1,则将计数器加 1,否则将计数器清零;
- 在每次计数器加 1 后,将计数器的值与最大长度变量 max 进行比较取较大值;
- 遍历完所有的二进制位后,最大长度变量 max 的值即为所求。
public static int maxConsecutiveOnes(int n) {
int count = 0, max = 0;
while (n != 0) {
if ((n & 1) == 1) { // 判断最低位是否为 1
count++;
} else {
max = Math.max(max, count); // 更新最大长度
count = 0; // 计数器清零
}
n >>>= 1; // 无符号右移一位
}
return Math.max(max, count); // 最后还要再更新一次最大长度
}
🏆下一篇:华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。