1029. 旧键盘(20)
原题: https://www.patest.cn/contests/pat-b-practise/1029
参考: https://github.com/Joshua-ZY/PAT
实现思路: 如果以前做过字符串去重, 那么做这题可能会有点启发. 刚开始我用的方法很笨, 需要
双重循环, 后来参考了网友的代码, 发现用一个128大小的ASCII数组来写, 非常简单.
首先有一个思想非常重要, 那就是如果这个键不是坏键的话那么这个按键对应的值一定能在实际输入
中找到, 比如题目中给的测试用例, 实际输入第一个字符是''那在应该输入的文字中找到第一个''
这个'_'之前的字符都是坏键. 这样每次找到一个好键之后, 就移动到下一个好键上继续找, 重复标记
采用ASCII码的方式, 一层循环, 核心代码不超过10行即可搞定.
坑1: 该题有两个1分的测试点坑, 题目说不超过80个字符, 也就是数组最小为81, 否则那两个1分的测试
点通不过.
完整代码:
#include <stdio.h>
#include <string.h>
char toUpperCase (char ch);
int main (void) {
char should[100] = {'\0'}; // 初始化成其它不可能出现的值也可以
char real[100] = {'\0'};
int ascii[128] = {0}; // 初始所有字符出现字数均为0
int pid = 0; // 指向实际输入字符串
int slen;
int i;
scanf("%s", should);
scanf("%s", real);
slen = strlen(should);
for (i=0; i<slen; i++) {
if (should[i] == real[pid]) {
pid++;
} else {
// 这时候该字符就是坏键
// 但是还需要考虑, 该键是否已经出现过
// 如果该键是小写, 则先转为大写
should[i] = toUpperCase(should[i]);
if (ascii[should[i]] == 0) {
ascii[should[i]] = 1;
printf("%c", should[i]);
}
}
}
printf("\n");
return 0;
}
// 小写字符转大写
// 若果本身不是小写字母, 则直接返回
char toUpperCase (char ch) {
if (ch >= 'a' && ch <= 'z') {
ch = ch - 32;
}
return ch;
}