统计二进制数中被1包围的0序列的Java代码问题排查
问题代码错误定位
- 字符比较逻辑错误
代码中char数组的元素是字符类型的'0'和'1',你直接用y[i]==0、y[i]==1判断,本质是比较ASCII码,'0'的ASCII码是48,所以这类判断永远返回false,所有和0相关的逻辑都不会执行,这是最核心的错误,需要改为y[i] == '0'、y[i] == '1'。 - 计数规则不匹配需求
你当前用y[i]!=y[i-1] && y[i]!=y[i+1]作为计数条件,只能识别单个0被1包裹的场景(比如101),遇到连续多个0被包裹的场景(比如1001)就会漏计。正确的逻辑应该是识别每一段连续的0,只要这段0的左侧和右侧都是1,不管0的长度是多少都计为1次。 - 存在完全冗余的无关逻辑
代码中的maxLocal、maxGlobal变量是用于统计最长0序列长度的,和当前统计符合条件的0序列数量的需求完全无关,属于冗余代码,且打印的maxGlobal值和要求的返回结果没有关联。 - 遍历范围存在漏洞
当前循环的终止条件是i<y.length-1,部分边界场景的判断会受影响,比如二进制1001长度为4,循环只能遍历到索引1和2,无法正确识别中间的连续0段是被1包裹的。
修正后可运行参考代码
package com.company; public class ToBinary { public String convertToBinary(int n) { return Integer.toBinaryString(n); } public int howMany(int number) { String binaryStr = convertToBinary(number); char[] chars = binaryStr.toCharArray(); int count = 0; // 标记当前是否在连续的0段中 boolean inZeroSeq = false; for (int i = 0; i < chars.length; i++) { if (chars[i] == '0') { inZeroSeq = true; } else { // 遇到1,且之前在0段中,判断0段左边是不是1 if (inZeroSeq) { int zeroStart = i - 1; while (zeroStart >=0 && chars[zeroStart] == '0') { zeroStart--; } if (zeroStart >= 0) { // 左边有1,说明这个0段被左右1包裹 count++; } inZeroSeq = false; } } } return count; } }
可自行测试用例:输入5(二进制101)返回1,输入9(二进制1001)返回1,输入293(二进制100100101)返回3,输入10(二进制1010)返回1,完全符合给出的计数规则。
内容的提问来源于stack exchange,提问作者WhoAmI
相关产品推荐
相关产品推荐

