1029 旧键盘 (20分)

43 篇文章 2 订阅

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

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

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

7_This_is_a_test
_hs_s_a_es

输出样例:

7TI

1、理解题意

给出应该输入的一段文字、以及实际被输入的文字,列出肯定坏掉的那些键,按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。

2、解题思路

(1)有两个问题需要解决:按顺序输出第一个字符串在第二个字符串中没有的字符,且英文字母均输出大写字母;确保输出的字符没有重复;
(2)定义一个整型数组hashTable,初值设置为0,先依次扫描第二个字符串,将其中的小写字母变成对应的大写字母,并将大写字母转化为数字id,数组hashTable以id为下标的值加1;然后依次扫描第一个字符串中的字符,并将小写字母转化为大写字母,顺便将其转化为数字id,若hashTable[id]==0,则说明这个字母没有在第二个字符串中出现,需要输出,设置记录数组count用来存放目标字符,每当扫描到hashTable[id]==0时,就将对应的字符存放到count数组中,同时将该字符对应的hashTable[id]加1(避免了同字符进入数组count);
(3)依次输出count中的字符。

#include<cstdio>
#include<cstring>
int hashFunc(char c){//将字符转化为数字 
	int id=0;
	for(int i=0;i<63;i++){
		if(c>='A'&&c<='Z'){
			id=c-'A'; 
		}else if(c>='a'&&c<='z'){
			id=c-'a'+26;
		}else if(c>='0'&&c<='9'){
			id=c-'0'+53;
		}else if(c=='_'){
			id=63;
		}
	}
	return id;
}
int main(){
	char str1[85],str2[85];
	scanf("%s %s",str1,str2);
	int hashTable[70]={0};
	int len1=strlen(str1);
	int len2=strlen(str2);
	for(int i=0;i<len2;i++){
		if(str2[i]>='a'&&str2[i]<='z'){//小写变大写 
			str2[i]=str2[i]-32;
		}
		int id=hashFunc(str2[i]);
		hashTable[id]++;
	}
	char count[85];
	int j=0;
	for(int i=0;i<len1;i++){
		if(str1[i]>='a'&&str1[i]<='z'){//小写变大写 
			str1[i]=str1[i]-32;
		}
		int id=hashFunc(str1[i]);
		if(hashTable[id]==0) {
			count[j++]=str1[i];
			hashTable[id]++;
		}
	}
	for(int i=0;i<j;i++){
		printf("%c",count[i]);
	}
	return 0;
}

3、总结

1、将字符转化为数字的过程可以直接用

int hashTable[128];

替代。在C语言中,字符常量使用ASCII码统一编码,标准ASCII码的范围是0~127,其中包含了控制字符或通信专用字符和常用的可显示字符。0到9、A到Z、a到z的ASCII码分别为48到57、65到90、97到122,小写字母比大写字母的ASCII码值大32。
2、涉及到字符串比较时,通常可以考虑hash(散列)法。
3、提供几个测试用例:

A_B_C_D
ABCD//正确输出:_

_DF_
_Df_//正确输出:无输出
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值