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

如何检测字符串中是否存在若干个0后跟随等量1的重复模式?

问题分析与修复

先直接说你代码的核心问题:

  • 字符串操作逻辑完全颠倒:你用num[i]从头部取字符做判断,却用num.pop_back()从尾部删字符存到st0/st1里。比如原字符串是"0011",你判断的是前两个'0'相等,但存的却是最后一个'1',所有统计逻辑全错。
  • 越界访问导致死循环:当num只剩1个字符时,num[j+1]会访问超出字符串范围的内存,这时候行为未定义,大概率让循环条件一直成立,直接死循环。
  • 计数逻辑混乱:外层循环的k用来统计处理过的字符数,但你每次pop就加1,可内部的i、j从0递增,和实际处理的字符位置完全不匹配,没法控制外层循环正常结束。

正确实现思路

要检测“若干个0后跟随数量相等的1”的重复模式,应该从左到右遍历,每轮做这几件事:

  1. 统计当前连续0的个数(必须从当前位置开始是0,否则直接判定错误)
  2. 紧接着统计连续1的个数(统计完0后没有1直接错误)
  3. 比较0和1的个数,不等则错误
  4. 把指针移到这段1的末尾,继续处理剩余字符串,直到整个字符串处理完毕

修复后的代码

#include <iostream>
#include <string>
using namespace std;

void check(string num) {
    int len = num.length();
    int idx = 0; // 当前遍历的位置
    
    while (idx < len) {
        // 统计连续的0的数量
        int count0 = 0;
        while (idx < len && num[idx] == '0') {
            count0++;
            idx++;
        }
        // 没有0直接不符合模式
        if (count0 == 0) {
            cout << "incorrect\n";
            return;
        }
        
        // 统计紧接着的连续1的数量
        int count1 = 0;
        while (idx < len && num[idx] == '1') {
            count1++;
            idx++;
        }
        // 1的数量和0不等,直接错误
        if (count1 != count0) {
            cout << "incorrect\n";
            return;
        }
    }
    // 所有段都符合条件
    cout << "correct\n";
}

// 测试示例
int main() {
    check("001101"); // 输出correct
    check("01"); // 输出correct
    check("001010"); // 输出incorrect
    return 0;
}

代码说明

  • 用idx指针从左到右遍历,避免修改原字符串,逻辑更清晰
  • 每轮先统计连续0的个数,确保模式以0开头
  • 再统计紧接着的连续1的个数,必须和0的数量匹配
  • 遍历完整个字符串无异常,就说明符合要求

内容的提问来源于stack exchange,提问作者tired

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:15:39