C++面试题:旧键盘题解
程序员文章站
2022-03-08 22:42:22
题目描述
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入描述:
输入在2行中分别给出应该输入的文...
题目描述
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入描述:
输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母a-z(包括大、小写)、数字0-9、以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。
输出描述:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。
输入例子:
7_this_is_a_test
_hs_s_a_es
输出例子:
7ti
解题思路
1. 题目的意思是说比较两个字符串(s1,s2),并输出不共有的字符
2. 利用stl中map,将s2中出现的不同字符存入m中,也就是说,只要s2中存在字符c,那么m[c]返回的都是true,同理s1和s2中相同的字符c,其返回都是true
3. 根据第二点可知,如果s1中某个字符c在s2中不存在,则m[c]返回false,而这个字符c则是题目所说的坏掉的键,将其输出即可
4. 总结下,对于这题可采用哈希表的思维处理,而如果是数组hash需要提前申请好足够的空间,此时用map可减少空间浪费
//主要算法 //zhicheng map<char,bool> m; int main() { string s1,s2; while(cin>>s1>>s2) { for(int i=0;i<s2.length();m[toupper(s2[i++])]==true);//将s2中的字符转为大写存入m中 for(int i=0;i<s1.length();i++) { char c=toupper(s1[i]); if(m[c]==false){m[c]=true;printf("%c",c);}//防止s1中已经输出的字符再次被输出 } printf("\n"); m.clear(); } return 0; }