1029 旧键盘(20)(20 分)无函数简明版与有函数最简版

本题链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805292322111488

1029 旧键盘(20)(20 分)

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

输入格式:

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

输出格式:

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

输入样例:

7_This_is_a_test
_hs_s_a_es

输出样例:

7TI

1.无函数简明版

分析:

这个思路应该是常规的,先定义一个数组,长度为256,标将作为字符的ASC码值,元素为0或1,0表示该字符不存在,1表示存在,将第2个串中的字符“存入”数组,再定义新串,然后在第1个串中过滤掉第2个串中的字符,得到新串。得到新串后,定义另一数组,长度为新串长度,用以存储下标。遍历新串,若字符不重复且为小写,则转为大写并存入数组,然后第2个数组存储其下标。最后遍历第2个数组,根据它的值访问新串中的元素并输出。

代码:

#include<iostream>
using namespace std;
int main()
{
	string should,actual,t;
	int book[256]={0};
	cin>>should>>actual;
	for(int i=0;i<actual.length();i++)
	book[actual[i]]=1;
	for(int i=0;i<should.length();i++)
	if(!book[should[i]])
	t+=should[i];
	int sub[t.length()],len=0;
	for(int i=0;i<256;i++)
	book[i]=0;
	for(int i=0;i<t.length();i++)
	{
		if(t[i]>='a'&&t[i]<='z')
		t[i]-=32;
		if(!book[t[i]])
		{
			book[t[i]]=1;
			sub[len++]=i;
		}
	}
	for(int i=0;i<len;i++)
	cout<<t[sub[i]];
	return 0;
}

2.有函数最简版

分析:

这个思路不算常规,如果短时间内想出需要比较高的思维层次,其思想是定义新串,遍历第1个串,如果第1个串的字符不在第2个串里且不在新串里,如果为小写则先转化为大写,然后新串存储之,最后输出。

 

代码:

#include<iostream>
#include<string>
#include<cctype>
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;
}

 

猜你喜欢

转载自blog.csdn.net/qq_37729102/article/details/81774256