旧键盘

链接:http://www.nowcoder.com/pat/6/problem/4055

题目描述

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出

肯定坏掉的那些键。

输入描述:

输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、

以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。



输出描述:

按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。

输入例子:

7_This_is_a_test

_hs_s_a_es

输出例子:

7TI

思路:题意还是比较简单,但是实现有点麻烦。1.重复的错误只输出第一次出现的情况就行,比如有两个I的地方都错了,只在第一个的位置处输出就行了。
2.需要按顺序输出,就是从头到尾找坏键的顺序。我写的比较麻烦,再看看有没有更简单的方法。
  1 #include "iostream"
  2 #include <iomanip>
  3 #include <string.h>
  4 #include <string>
  5 #include <vector>
  6 #include <cmath>
  7 #include <cctype>
  8 #include <algorithm>
  9 using namespace std;
 10 
 11 int main()
 12 {
 13     int mark[80];
 14     int value[80];
 15     int flag[80];
 16     memset(flag, 0, sizeof(flag));
 17     memset(mark, 0, sizeof(mark));
 18     memset(value, 0, sizeof(value));
 19     string str1, str2;
 20     cin >>str1 >>str2;
 21     int i=0, j=0, k=0;
 22     for(; i<str1.length()&&j<str2.length(); ++i)
 23     {
 24         if(str1[i] == str2[j])
 25         {
 26             ++j;
 27         }
 28         else
 29         {
 30             if(isupper(str1[i]))
 31             {
 32                 //mark[int(str1[i]-'A')+10] = 1;
 33                 mark[k] = 1;
 34                 value[k++] = int(str1[i]-'A'+10);
 35             }
 36             else
 37             {
 38                 if(islower(str1[i]))
 39                 {
 40                     //mark[int(str1[i]-32-'A')+10] = 1;
 41                     mark[k] = 1;
 42                     value[k++] = int(str1[i]-32-'A'+10);
 43                 }
 44                 else
 45                 {
 46                     if(isdigit(str1[i]))
 47                     {
 48                         //mark[int(str1[i]-'0')] = 1;
 49                         mark[k] = 2;
 50                         value[k++] = int(str1[i]-'0');
 51                     }
 52                     else
 53                     {
 54                         mark[k] = 3;
 55                         value[k++] = -1;
 56                     }
 57                 }
 58             }
 59         }
 60     }
 61     for(; i<str1.length(); ++i)
 62     {
 63         if(isupper(str1[i]))
 64         {
 65             //mark[int(str1[i]-'A')+10] = 1;
 66             mark[k] = 1;
 67             value[k++] = int(str1[i]-'A'+10);
 68         }
 69         else
 70         {
 71             if(islower(str1[i]))
 72             {
 73                 //mark[int(str1[i]-32-'A')+10] = 1;
 74                 mark[k] = 1;
 75                 value[k++] = int(str1[i]-32-'A'+10);
 76             }
 77             else
 78             {
 79                 if(isdigit(str1[i]))
 80                 {
 81                     //mark[int(str1[i]-'0')] = 1;
 82                     mark[k] = 2;
 83                     value[k++] = int(str1[i]-'0');
 84                 }
 85                 else
 86                 {
 87                     //mark[36] = 1;
 88                     mark[k] = 3;
 89                     value[k++] = -1;
 90                 }
 91             }
 92         }
 93     }
 94     for(int i=0; i<k; ++i)
 95     {
 96         if(flag[value[i]] == 1) continue;
 97         if(mark[i] == 1)
 98         {
 99             cout <<char(value[i]+'A'-10);
100             flag[value[i]] = 1;
101         }
102         else
103         {
104             if(mark[i] == 2)
105             {
106                 cout <<value[i];
107                 flag[value[i]] = 1;
108             }
109             else
110             {
111                     cout <<'_';
112                     flag[36] = 1;
113             }
114         }
115     }
116     cout <<endl;
117     return 0;
118 }
原文地址:https://www.cnblogs.com/mtc-dyc/p/4625759.html