PAT甲级1112 Stucked Keyboard (20分)|C++实现

一、题目描述

原题链接
在这里插入图片描述

Input Specification:

在这里插入图片描述

​​Output Specification:

在这里插入图片描述

Sample Input:

3
caseee1__thiiis_iiisss_a_teeeeeest

Sample Output:

ei
case1__this_isss_a_teest

二、解题思路

利用一个unordered_map存放错误字符被检测到的顺序,对于正常字符则设为-1,遍历原来的字符串更新这个unordered_map。随后遍历这个unordered_map,如果对应的数字大于0,则将该字符存入ans中,按照被发现的顺序排序,最后遍历原字符串进行判断输出即可。具体细节可见代码注释。

三、AC代码

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
unordered_map<char, int> mp;    //用于存放每个每个字符被检测到的顺序,如果没被检测过就是0,被检测正常则设为-1
bool cmp(char a, char b)    //按照存放顺序排序
{return mp[a] < mp[b];}
int main()
{
    int K;
    string str;
    scanf("%d", &K);
    cin >> str;
    int order = 1;
    for(int i=0; i<str.size()-1; )
    {
        int cnt = 1;    //表示重复的个数
        while(str[i] == str[i+1])   //如果重复,cnt++,i++
        {
            cnt++;
            i++;
        }
        if(mp[str[i]] == 0 && cnt%K == 0)   mp[str[i]] = order++;   //填入被检测的顺序
        else if(cnt%K != 0)    mp[str[i]] = -1; //如果出现某一字符重复次数不是k的整数倍,则这个字符必然不是坏掉的那个按键
        i++;
    }
    string ans = "";
    for(auto it : mp)
    {
        if(it.second > 0)  ans += it.first; //ans存放发生错误的字符
    }
    sort(ans.begin(), ans.end(), cmp);  //按照被检测的顺序排序
    cout << ans << endl;
    for(int i=0; i<str.size(); )    //遍历原来的字符串,遇到错误的就只输出一次,无错误的就正常输出
    {
        if(mp[str[i]] > 0)
        {
            cout << str[i];
            i += K;
        }
        else
        {
            cout << str[i];
            i++;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值