首页 > 技术文章 > A1112 Stucked Keyboard (20分)

tsruixi 2020-05-28 20:22 原文

一、技术总结

  1. 本题考察C++标准模板库STL的使用,使用到的有map、set、string。
  2. 题意是首先给出一个数字k,代表一个坏键的重复打印出现的次数k,然后给出一串字符串,然后需要我们判断该字符串中坏键有哪些。
  3. 首先需要使用string将该字符串存储起来,string类型的字符串只能够使用cin输入cout输出整个输出,需要注意,但是可以一个一个字符使用printf输出。
  4. 然后遍历该字符串,我们需要设置map<char, bool>类型的来判断该字符是否为坏键,依次遍历该字符串,如果字符出现次数为k的倍数,那么就设置为坏键,否者在map中不是。
  5. 上面这会出现一个问题,如果一个键不是坏键,但是打印的次数恰好大于等于k,那么可能误判为坏键,因此需要额外设置一个bool类型的数组,一旦一个字符出现后,没有打印k的倍数,就一定不是坏键。因此需要将该数组和map一起判断字符键是否为坏键。
  6. 最后就是遍历字符串,将坏键输出,如果输出过,就将该字符放入set集合中,防止二次输出。
  7. 最后就是输出正常的字符串,一旦遇到坏键,跳过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;
} 

推荐阅读