PAT A1084 Broken Keyboard (20 分) +B1033(hash&&PAT中不能用gets()的解决办法)

题目大意:

  • 给出两行字符,要求找出 第一行有的 && 第二行没有 的字符,每个字符按照大写输出,只输出一遍,空格也算。

注意点

  • 用到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;	
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值