You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

统计二进制数中被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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:39:02