pat甲级1112. Stucked Keyboard (20)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/80156289

欢迎访问我的pat甲级题解目录哦https://blog.csdn.net/richenyunqi/article/details/84981078

题目描述

算法设计

这道题处理起来比较麻烦,定义一个长度为128的int数组hashTable,下标表示字符,元素为1表示该字符是坏键,为-1表示该字符不是坏键,元素为0表示该字符还没有遇到过。遍历输入的字符串input,统计连续出现的重复字符的个数是否是K的整数倍,若不是表示该字符必然不是坏键;如果在输入的字符串input中某字符连续出现的重复个数都是K的整数倍,那么该字符是坏键。注意,是坏键的条件比较苛刻,只要某字符有一次重复出现的个数不是K的整数倍,那么此键就不是坏键。

再次遍历字符串Input,将hashTable对应元素大于0的坏键进行输出,注意同一个字符只能输出1次,且需按在字符串input中出现的顺序进行输出。然后输出正确的字符串,每K个坏键输出一次,每1个良好的键都输出1次即可。

注意点

  1. 是坏键的条件比较苛刻,只要某字符有一次重复出现的个数不是K的整数倍,那么此键就不是坏键。
  2. 输出坏键时同一个坏键只能输出1次,且需按在字符串input中出现的顺序进行输出。

C++代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    string input,output="";
    int K;
    cin>>K>>input;
    int hashTable[128]={0};//表示是不是坏键
    for(int i=0;i<input.size();){
        int j=i+1;
        while(j<input.size()&&input[j]==input[i])//找到i位置后第一个不等于input[i]的字符位置
            ++j;
        if(hashTable[input[i]]>=0)//当前的input[i]不是坏键
            hashTable[input[i]]=(j-i)%K==0?1:-1;//通过连续出现的input[i]的个数是否是K的整数倍给hashTable赋值1、-1
        i=j;
    }
    bool out[128]={false};//表示字符是否已被输出过
    for(int i=0;i<input.size();){
        output+=input[i];//将当前字符加入正确的字符串中
        if(hashTable[input[i]]>0){//是坏键
            if(!out[input[i]]){//没被输出过
                printf("%c",input[i]);//输出此坏键
                out[input[i]]=true;//此坏键已被输出过
            }
            i+=K;//每K个坏键在正确的字符串中只输出1次
        }
        else if(hashTable[input[i]]<0)//不是坏键
            ++i;//继续遍历下一字符
    }
    cout<<endl<<output;//输出正确的字符串
    return 0;
}

 

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试