A1112 Stucked Keyboard (20分)
一、技术总结
- 本题考察C++标准模板库STL的使用,使用到的有map、set、string。
- 题意是首先给出一个数字k,代表一个坏键的重复打印出现的次数k,然后给出一串字符串,然后需要我们判断该字符串中坏键有哪些。
- 首先需要使用string将该字符串存储起来,string类型的字符串只能够使用cin输入cout输出整个输出,需要注意,但是可以一个一个字符使用printf输出。
- 然后遍历该字符串,我们需要设置map<char, bool>类型的来判断该字符是否为坏键,依次遍历该字符串,如果字符出现次数为k的倍数,那么就设置为坏键,否者在map中不是。
- 上面这会出现一个问题,如果一个键不是坏键,但是打印的次数恰好大于等于k,那么可能误判为坏键,因此需要额外设置一个bool类型的数组,一旦一个字符出现后,没有打印k的倍数,就一定不是坏键。因此需要将该数组和map一起判断字符键是否为坏键。
- 最后就是遍历字符串,将坏键输出,如果输出过,就将该字符放入set集合中,防止二次输出。
- 最后就是输出正常的字符串,一旦遇到坏键,跳过k-1位继续输出。
二、参考代码
#include<bits/stdc++.h>
using namespace std;
map<char, bool> m;//用于记录字符是否为坏键,如果是则为true,否则为false
set<char> printed;//用于存储看坏键是否已经输出
bool NosureBroken[256];
int main(){
int k, cnt = 1;
string s;
scanf("%d", &k);
cin >> s;
char pre = '#';
s += '#';
for(int i = 0; i < s.length(); i++){
if(s[i] == pre){
cnt += 1;
}else{
if(cnt % k != 0){
NosureBroken[pre] = true;
}
cnt = 1;
}
if(i != s.length() - 1) m[s[i]] = (cnt % k == 0);
pre = s[i];
}
for(int i = 0; i < s.length() - 1; i++){
if(NosureBroken[s[i]] == true){
m[s[i]] = false;
}
}
for(int i = 0;i < s.length() - 1; i++){
if(m[s[i]] && printed.find(s[i]) == printed.end()){
printf("%c", s[i]);
printed.insert(s[i]);
}
}
printf("\n");
for(int i = 0; i < s.length() - 1; i++){
printf("%c", s[i]);
if(m[s[i]]){
i = i + k - 1;
}
}
return 0;
}
作者:睿晞
身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
曾有一个业界大牛说过这样一段话,送给大家:
“华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.