【错题集-编程题】小葱的01串(滑动窗口)

简介: 【错题集-编程题】小葱的01串(滑动窗口)


一、分析题目


二、代码

1、看了题解之后AC的代码

#include <iostream>
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    string s;
    cin >> s;
    int zero=0, one=0;
    for(auto ch : s)
    {
        if(ch=='0') zero++;
        if(ch=='1') one++;
    }
    int res=0;
    int half=n/2;
    int zero_cnt=0, one_cnt=0;
    int left=0, right=0;
    while(right<n-1) //细节:防止重复计数
    {
        if(s[right]=='0') zero_cnt++;
        if(s[right]=='1') one_cnt++;
        while(right-left+1>half)
        {
            if(s[left]=='0') zero_cnt--;
            if(s[left]=='1') one_cnt--;
            left++;
        }
        if(right-left+1==half)
        {
            if(zero_cnt*2==zero && one_cnt*2==one)
                res+=2;
        }
        right++;
    }
    cout << res << endl;
    return 0;
}

2、值得学习的代码

#include <iostream>
#include <string>
 
using namespace std;
 
int n;
string s;
 
int main()
{
    cin >> n >> s;
    int sum[2] = { 0 }; // 统计字符串中所有 0 和 1 的个数
    for(auto ch : s)
    {
        sum[ch - '0']++;
    }
 
    int left = 0, right = 0, ret = 0, half = n / 2;
    int count[2] = { 0 }; // 统计窗⼝内 0 和 1 的个数
    while(right < n - 1) // 细节问题
    {
        count[s[right] - '0']++;
        while(right - left + 1 > half)
        {
            count[s[left++] - '0']--;
        }
        if(right - left + 1 == half)
        {
            if(count[0] * 2 == sum[0] && count[1] * 2 == sum[1])
            {
                ret += 2;
            }
        }
        right++;
    }
 
    cout << ret << endl;
 
    return 0;
}

三、反思与改进

这道题我一开始的做法是暴力解法,就是先统计字符串里面 0 和 1 的个数,因为题目明确说明了字符串的长度是偶数,所以再记录一下 0 和 1 数量的一半(这个是这道题的解题关键)。因为受到 “环形” 这一限制,我后面就想到了得用滑动窗口来解这道题,但是却忽略了一些细节,只过了 50% 的测试用例。在计算满足条件的连续区间数量时,没有考虑正确环形字符串的特性,所以即使我在字符串的末尾添加了一段和起始位置相同的字符串,但是我的循环仍然只考虑了从起始位置开始的子串,这就可能会导致遗漏一些解。

上面给出的代码不需要在字符串末尾添加字符,而是利用了字符串长度为偶数这一特性,一次+2,因为其中一半符合条件,那么剩下的一般一定也符合条件。


相关文章
|
XML 安全 Java
SpringSecurity系列(三) Spring Security 表单登录
SpringSecurity系列(三) Spring Security 表单登录
332 0
|
Python
Python面向对象(2)
【10月更文挑战第14天】
171 6
Python面向对象(2)
|
程序员 开发工具 git
Git提交错了?别慌,学会直接删除提交记录
【8月更文挑战第7天】在日常的开发工作中,使用Git进行版本控制几乎是每位程序员的必修课。然而,即使是经验丰富的开发者,也难免会遇到“哎呀,我不小心提交了一些不该提交的内容!”的尴尬时刻。面对这样的错误,不必惊慌失措,Git提供了强大的功能来帮助我们修正这些错误,包括直接删除错误的提交记录。
1216 0
|
移动开发 小程序 前端开发
小程序业务域名配置如何将文件放置在域名根目录说明
最近的需求中要求在小程序中跳转h5项目,前端需要提供一下业务域名.简单记录一下配置的注意事项
小程序业务域名配置如何将文件放置在域名根目录说明
|
前端开发
前端 CSS 经典:鼠标位置信息
前端 CSS 经典:鼠标位置信息
148 0
|
编译器 开发工具 C语言
Objective—C语言的新魅力——Nullability、泛型集合与类型延拓(一)
Objective—C语言的新魅力——Nullability、泛型集合与类型延拓
201 0
Objective—C语言的新魅力——Nullability、泛型集合与类型延拓(一)
|
7天前
|
云安全 人工智能 自然语言处理
|
11天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
990 35
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
670 4