旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入格式:
输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _
(代表空格)组成。题目保证 2 个字符串均非空。
输出格式:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。
样例:">样例:">样例:">样例:">样例:">样例:">样例:">样例:">输入样例:
7_This_is_a_test
_hs_s_a_es
输出样例:
7TI
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
分析:用二重循环就是逐个遍历两个字符串,如果第1个字符串中的字符在第2个字符串中没有出现过,输出这个字符,输出的过程中要注意把小写字母转化为大写字母。是用一个数组来标记它是否输出过,这样就避免了重复输出的问题。分类讨论还是很重要的思想,把每种情况分开讨论就比较容易解决。所以分类的标准就至关重要,练,练,练。
代码如下:
#include <stdio.h>
#include <string.h>
#define N 100
int main() {
char a[N], b[N];
int sign[36] = {0};//计数数组,用来记录数组下标对应的字符是否输出过;对应规则:0~9,-48,A~Z,-65+10;
gets(a);
gets(b);
int i, j;
for(i = 0; i < strlen(a); i++) {
int tem = 0, mid;
for(j = 0; j < strlen(b); j++) {
if('0' <=a[i] && a[i] <= '9') {
tem = a[i] - 48;//判断是否是数字
if(a[i] == b[j]) {//a[i] == b[j]写成了a[i] == a[j]我说怎么。不对呢。就是一个小细节没处理好,然后害老子多耽搁了20分钟。
break;
}
}
else if( ('a'<= a[i] && a[i] <= 'z')){
tem = a[i] - 'a' + 10;//和数组下标相对应,顺带计算一下
if(a[i] == b[j] || a[i] - 32 == b[j]) {
break;
}
}
else if( ('A'<= a[i] && a[i] <= 'Z')){
tem = a[i] - 'A' + 10;
if(a[i] == b[j] || a[i] + 32 == b[j]) {
break;
}
}
else{
if(a[i] == b[j])
break;
}
}
// printf("tem = %d\n",tem);
// printf("sign = %d\n",sign[tem]);
// printf("mid = %d\n",mid);
if(sign[tem] == 0 && j == strlen(b)) {
if( ('a'<= a[i] && a[i] <= 'z')){
a[i] = a[i] - 32;//把小写转化成大写
}
printf("%c",a[i]);
sign[tem] = 1; //标记该字符已被输出
}
}
return 0;
}