题目大意:
- 给出两行字符,要求找出 第一行有的 && 第二行没有 的字符,每个字符按照大写输出,只输出一遍,空格也算。
注意点:
-
用到hashTable,数组下标可用ASCII对应,一般情况下设置数组大小为128
-
gets函数在PAT里不能通过编译(因为OJ把gets禁用了),可以用fgets替代,用法:
- fgets( str1,100,stdin)
- str1:字符串名称
- 100:字符串最大长度
- stdin表示键盘输入
我的代码
#include<cstdio>
#include<string>
#include<cstring>
bool hashTable[128]={false};
char str1[100],str2[100];
char aToA(char a)
{
if(a>='a'&&a<='z')
a-=32;
return a;
}
int main()
{
// gets(str1);
// gets(str2);
// puts(str1);
// puts(str2);
fgets(str1,100,stdin);
fgets(str2,100,stdin);
int len1=strlen(str1);
int len2=strlen(str2);
for(int i=0;i<len1;i++)
{
int j=0;
char c1,c2;
c1=aToA(str1[i]);
for(j=0;j<len2;j++)
{
c2=aToA(str2[j]);
if(c1==c2)
break;
}
if(j==len2&&hashTable[c1]==false)
{
printf("%c",c1);
hashTable[c1]=true;
}
}
return 0;
}
B1033(简要记录)
和上道题意思差不多。
str1是坏键,str2是本应该输出的字符串,求输出结果。
注意点:
- 如果shift键(+)坏了,则所有大写字母不能输出
- 步骤:
- 检测str1中是否有 ‘+’,如果有,置Aflag为真
- 将str1的字符设置为hash数组
- 为方便str2输出,将str1中的大写字母转为小写(设置一个函数)
- 枚举str2
我的代码:
#include<cstdio>
#include<cstring>
bool hashTable[128]={false};
const int MAXN=100010;
char str1[MAXN],str2[MAXN];
char AToa(char s)
{
if(s>='A'&&s<='Z')
s+=32;
return s;
}
int main()
{
fgets(str1,MAXN,stdin);
fgets(str2,MAXN,stdin);
int len1=strlen(str1);
int len2=strlen(str2);
//处理str1中的坏键
bool Aflag=false; //大写键是否坏掉
for(int i=0;i<len1;i++)
{
char c1=str1[i];
if(c1=='+')
Aflag=true;
//大写转化成小写
c1=AToa(c1);
hashTable[c1]=true;
}
//枚举str2
for(int i=0;i<len2;i++)
{
char c2=str2[i];
if(c2>='A'&&c2<='Z'&&Aflag==true)
continue;
c2=AToa(c2);
if(hashTable[c2]==true)
continue;
else
{
printf("%c",str2[i]);
}
}
return 0;
}