pat 乙级 1029 旧键盘(C++)

题目

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

输入格式:

输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _(代表空格)组成。题目保证 2 个字符串均非空。

输出格式:

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

输入样例:

7_This_is_a_test
_hs_s_a_es

输出样例:

7TI

分析

  • 应该输入的文字设为s1,实际被输入的文字设为s2。
  • 如果键没坏,那么在s1中出现的s2中一定会出现。找坏键,排除没坏的情况就可以了。但是要注意,结果里不能有重复的两个键。
  • 方法1:在s2中遍历在s1中的每一个字符,如果相等则停止进行下一轮比较;如果直到s2结束都没找到相等的,再看结果字符串中之前是否已经存入这个键,如果没有则放入,否则舍弃。
  • 方法2:使用string类的find函数以及c的tuopper函数,这个方法是柳神找到的。柳婼 の blog
  • 本题由于字符个数较少,所以两种方法耗时差不多,但柳神姐姐的代码好简洁!系统提供了函数的一定要用系统的,因为一是方便而且代码简洁,二是官方给的函数效率一般都比我们自己写的要好,太香了。

AC代码

方法1代码

#include
#include
using namespace std;
int main()
{
	string s1,s2,result;
	int i,j,k,len1,len2;
	cin>>s1>>s2;
	len1=s1.length();
	len2=s2.length();
	for(i=0;i<len1;i++)
	{
		for(j=0;j<len2;j++)
		{
			if(s1[i]==s2[j])//如果s1中有字符在s2中出现,改键没有坏
			{
				break;
			}
			if(j==len2-1) 
			{
                int flag=0;//作为本次比较中坏键之前是否已被记录的标志
				for(k=0;k<result.length();k++)//判断坏键是否已记录
				{
                    if(s1[i]>='a'&&s1[i]<='z')
                    {
                        if(s1[i]-('a'-'A')==result[k])
                        {
                            flag=1;
                            break;
                        }
                    }
                    
					if(result[k]==s1[i])
                    {
                        flag=1;
                        break;
                    }	
                    
				}
                if(flag==0)//坏键且没有被记录过
                {
                    if(s1[i]>='a'&&s1[i]<='z')//小写字母需要大写
					    result+=s1[i]-('a'-'A');//ASCII码
                    else    //非小写字母直接记录
					    result+=s1[i];	
                }
				
					
			}
		}
	}

	cout<<result;
	return 0;
}

方法2代码

#include 
#include 
using namespace std;
int main() {
    string s1, s2, ans;
    cin >> s1 >> s2;
    for (int i = 0; i < s1.length(); i++)
        if (s2.find(s1[i]) == string::npos && ans.find(toupper(s1[i])) == string::npos)
            ans += toupper(s1[i]);
    cout << ans;
    return 0;
}

方法2注解

  • find函数:多种重载,本处使用的是
  • size_type find(const char ch, size_type pos = 0) const,从字符串的pos位置开始,查找字符ch。如果找到,则返回该字符首次出现的位置;否则,返回string::npos。
  • size_type:是用来描述string或者vector等容器长度的数据类型,一般认为是unsigned int。
  • string::npos的值不同机器可能有差异,我的机器(64位)测试:是unsigned long的最大值:18446744073709551615
  • int toupper(int c):如果 c 有相对应的大写字母,则该函数返回 c 的大写字母,否则返回c本身。返回值是一个可被隐式转换为 char 类型的 int 值。

方法2参考:
1029. 旧键盘(20)-PAT乙级真题

更多题解

pat 乙级(Basic Level) 题解汇总(持续更新)(C++)

你可能感兴趣的:(pat,乙级,C++,字符串,PAT乙级,PAT,Basic,Level)