题目:旧键盘

题目:旧键盘

题目描述
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入描述:
输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。
输出描述:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。
输入例子:
7_This_is_a_test
_hs_s_a_es
输出例子:
7TI
解题思路1:

  本题大意是对比第一个和第二个字符串,从而判断出哪些字符串是第一个具有而第二个不具备的。本题和一般的字符串比对题目不同的地方在于,本题串1和串2的输入是两者的字符具备相同先后顺序的,因此我们可以使用双指针的方法(为了便于比较,先定义函数,用for循环将两串大写英文字符全部转为小写),定义两个指针i和j,分别从0开始遍历,依次对比串1和串2两者指针所指向字符是否有区别,存在区别则记载串1中字符,并递增i;当前指针指向字符相同则说明该字符键没坏,则同时递增i和j,直至遍历完串1或串2(此处不能只遍历完串2,因为串2可能会存在字符是串1中不曾存在的字符键,但我们无需记载串2中单独存在字符)。注意,若遍历完成,还需查询串1是否全部遍历,若未曾全部遍历,则说明剩下的全部为缺省键,需记载。最后,按存储顺序输出缺省字符,并定义bool数组,用于记载某字符是否输出过(题意规定每个字符只需输出一次)。

代码:
#include <iostream>
#include <string>

using namespace std;

const int N = 300;

char Key[N];         //存储缺省字符键
bool flag[N];        //记载是否输出某字符

//英文串转小写 
void transabc(string& str) {
	for(int i = 0; i < str.size(); i++) {
		if(str[i] >= 'A' && str[i] <= 'Z') str[i] = str[i] - 'A' + 'a';
	}
} 

int main() {
	
	string Str1, Str2;
	
	getline(cin, Str1);		//输入数据,getline整行输入 
	getline(cin, Str2);
	
	//将两串大写英文转为小写 
	transabc(Str1);
	transabc(Str2);
	
	int cnt = 0;			//存储字符索引	
	
	int i, j;
	//双指针遍历两个字符串,通过对比字符串可知缺少哪些按键 
	for(i = 0, j = 0; j < Str2.size() && i < Str1.size();  ) {
		//其他字符两串相等,一同向后递增 
		if(Str1[i] == Str2[j]) {
			i++, j++;
		}
		//不相等,说明缺省,记录按键,并递增i 
		else {
			Key[cnt++] = Str1[i];
			//cout << Str1[i];
			i++;
		} 
	}
	
	//如果串1还存在没有遍历完的数
	//这些数均为缺省键 
	while(i < Str1.size()) {
		Key[cnt++] = Str1[i];
		i++;
	}
	
	//输出数据
	for(int i = 0; i < cnt; i++) {
		//如果存在按键未曾输出,则输出,并记载输出记录 
		if(!flag[int(Key[i])]) {
			//英文字母 
			if(Key[i] >= 'a' && Key[i] <= 'z') cout << char(Key[i] - 'a' + 'A');
			else cout << char(Key[i]);
			flag[int(Key[i])] = true;
		} 
	} 
	
	return 0;
} 

  1. 注:本po主第一次写博文,难免会存在疏漏之处,望同行们多多指正!!也希望自己能够养成写算法博客的习惯,并持之以恒地坚持下去!加油!!!1 ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值