JavaScript PAT乙级题解 1033 旧键盘打字

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?

输入格式:

输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 105 个字符的串。可用的字符包括字母 [a-zA-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);
    }
  });
}

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值