PTA:B1029/B1033 旧键盘问题。c++

B1029 旧键盘

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

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

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

sample input:
7_This_is_a_test
_hs_s_a_es

sample output:
7TI

思路:

  • 由于判断字母的过程中不区分大小写,并且所有的输出都是大写字母形式,所以在对字符进行检测的时候可以统一将小写字母转化成大写字母的样式
  • 因为一个字符只能出现一次,所以可以设置一个bool型的数组来判断这个字符到底有没有输出过,数组长度只要能包含a-z,A-Z,0-9,_就可以,我用了asc码的数量开了数组。

刚开始代码中使用的是gets进行字符串的读入,一般来说,在c++中使用gets()函数只需要调用头文件< cstdio >,但是在进行测试时,PTA会给出编译错误: error: ‘gets’ was not declared in this scope gets(s)

查询之后了解到PTA网站不支持gets()方式了,那么可以通过添加头文件< iostream >,使用cin.getline(s,100)方式来进行一长串字符串的输入;也可以选择scanf("%s"),但需要注意,scanf方式读到空格就会自动停止,不再读入。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
 char str1[88],str2[88];
 bool visit[128]={false};
// gets(str1);
// gets(str2);
 cin.getline(str1,88);
 cin.getline(str2,88);
 int len1=strlen(str1);
 int len2=strlen(str2);
 for(int i=0;i<len1;i++)
 {
  int j;
  char c1,c2;
  for(j=0;j<len2;j++)
  {
   c1=str1[i];
   c2=str2[j];
   if(c1>='a'&&c1<='z')c1-=32;
   if(c2>='a'&&c2<='z')c2-=32;
   if(c1==c2)break;
  }
  if(j==len2&&visit[c1]==false)
  {
   printf("%c",c1);
   visit[c1]=true;
  }
 }
 return 0;
}

B 1033 旧键盘打字

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?

输入格式:
输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 10​5​​ 个字符的串。可用的字符包括字母 [a-z, A-Z]、数字 0-9、以及下划线 _(代表空格)、,、.、-、+(代表上档键)。题目保证第 2 行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。

输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。

sample input:
7+IE.
7_This_is_a_test.

sample output:
_hs_s_a_tst

思路:

  • 一个字母键坏了回导致大小写都没有办法输出,所以要先将所有的字母统一大小写再进行比较
  • 还是使用一个bool型的数组进行判断,注意对于较大的数组,想统一所有元素的值可以使用memset函数
  • 能输出大写字母的前提是字母的键和上档位‘+’都是完好的
  • 这道题不能用scanf("%s"),也不能用gets。后者的原因在上面已经讲到了;如果使用前者会发现有一个数据点没有办法通过,是因为不能忽略输入的第一行可能为空的情况(即没有一个键坏掉)。使用scanf会自动跳过空格,这样系统就会默认并没有读入第一行。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
 bool visit[300];
 memset(visit,true,sizeof(visit));
 char str[100011];
 cin.getline(str,100011);
 int len=strlen(str);
 for(int i=0;i<len;i++)
 {
  if(str[i]>='A'&&str[i]<='Z')
   str[i]=str[i]+32;
  visit[str[i]]=false;
 }
 cin.getline(str,100011);
 len=strlen(str);
 for(int i=0;i<len;i++)
 {
  if(str[i]>='A'&&str[i]<='Z')
  { 
   int tempstr=str[i]+32;
   if(visit[tempstr]==true&&visit['+']==true)
   {
    cout<<str[i];
   }
  }
  else if(visit[str[i]]==true)
  {
   printf("%c",str[i]);
  } 
 }
 cout<<endl;
 return 0;
}
发布了29 篇原创文章 · 获赞 1 · 访问量 942

猜你喜欢

转载自blog.csdn.net/qq_44654498/article/details/104941279