欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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;
}