旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 105 个字符的串。可用的字符包括字母 [a
-z
, A
-Z
]、数字 0
-9
、以及下划线 _
(代表空格)、,
、.
、-
、+
(代表上档键)。题目保证第 2 行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:
7+IE.
7_This_is_a_test.
输出样例:
_hs_s_a_tst
解答如下:
20/20 一遍过!开心!
先处理坏掉的键,用isShift存储shift键是否坏掉,如果坏掉那所有的大写字母都无法打出;如果一个字母的大写字母坏掉,那说明其小写也无法打出,将其小写字母也存到ErrorArr中,使用ascii码进行计算,小写字母的ascii码比其对应的大写字母大32
处理好之后再来遍历第二行字符串,先判断shift是否坏掉,如果坏掉所有的大写字母都不能加入output中,再判断遍历的字符是否在errorArr中,如果不在的话才能push到output中,最后输出output即可
(换一张美丽的封面看能不能遇到同好哈哈哈哈)
/**
* 2024/03/07
* 20/20
*/
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
// 输入行数
let num = 2;
const rows = [];
// 如果+,则所有大写字母无法打出,ascii 65-90
// 如果一个字母无法被打出,则她的大写和小写都无法被打出,error中给出的是大写,小写字母的ascii比大写字母大32
let ErrorArr = [];
// shift键是否坏掉
let isShift = false;
// 需要输入的文字
let input;
// 输出的文字
let output = [];
rl.on("line", function (data) {
rows.push(data);
if (num === rows.length) {
deal();
console.log(output.join(""));
}
});
function deal() {
ErrorArr = rows[0].split("");
ErrorArr.forEach((el) => {
if (el === "+") {
isShift = true;
} else {
// 一开始这里我还用charCodeAt方法将el转成ascii码的形式再比大小
// 后来发现根本没必要,直接用大写字符就能比较大小
// 但是在求其对应的小写字母的时候不能直接用加法,因为js的加法会涉及到隐式转换
// 加号两边有字符串就会把另一边也转换成字符串再进行拼接
// 所以我把他转ascii码处理后再转成字母
// 不知道这里有没有更好的做法呢
if (el >= "A" && el <= "Z") {
ErrorArr.push(String.fromCharCode(el.charCodeAt(0) + 32));
}
}
});
input = rows[1].split("");
input.forEach((el) => {
if ((!isShift || el < "A" || el > "Z") && !ErrorArr.includes(el)) {
output.push(el);
}
});
}