题目描述
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入格式
输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _(代表空格)组成。题目保证 2 个字符串均非空。
输出格式
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。
输入样例
7_This_is_a_test
_hs_s_a_es
输出样例
7TI
分析?
输入的数据先将小写字母转换为大写字母。
用一个数组flag[]
保存是否是第一次检测到坏键。因为第一次坏键需要输出坏键。
代码?
/**********************************************************************************
Submit Time Status Score Problem Compiler Run Time User
7/15/2019, 18:15:34 Accepted 20 1029 Java (openjdk) 114 ms wowpH
**********************************************************************************/
import java.util.Scanner;
public class Main {
private static boolean isBad(boolean[] flag, char ch) { // 判断ch是否已经是坏键
int index = flag.length - 1; // 默认ch是空格
if (ch >= 'A' && ch <= 'Z') { // ch是大写字母
index = ch - 'A';
} else if (ch >= '0' && ch <= '9') { // ch是数字
index = ch - '0' + 26;
}
boolean ans = flag[index]; // 保存结果
flag[index] = true; // ch是坏键,设为true
return ans;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 应该输入的数据,转换为大写字母,转换为字符数组
char[] arr1 = sc.next().toUpperCase().toCharArray();
// 实际输入的数据,转换为大写字母,转换为字符数组
char[] arr2 = sc.next().toUpperCase().toCharArray();
boolean[] flag = new boolean[37]; // 坏键标志,A-Z,0-9,_
int i = 0, j = 0;
for (; i < arr1.length && j < arr2.length; ++i) { // 遍历字符数组
if (arr1[i] == arr2[j]) { // 字符相同,下标加1
++j;
} else if (false == isBad(flag, arr1[i])) { // 字符不同且第一次坏
System.out.print(arr1[i]); // 输出坏键
}
}
if (j == arr2.length) { // 实际数据已遍历完
for (; i < arr1.length; ++i) { // 继续遍历应该输入的数据
if (false == isBad(flag, arr1[i])) { // 第一次坏
System.out.print(arr1[i]); // 输出坏键
}
}
}
sc.close();
}
}
版权声明
- 转载、参考、引用必须在首页添加如下文字:
[PAT(B) 1029 旧键盘(Java)字符串—wowpH](https://blog.csdn.net/pfdvnah/article/details/96006133)
- 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);
- 如果有疑问欢迎评论区留言,尽量解答;
- 如果有错误,还望大侠评论区指正。