JavaScript PAT乙级题解 1043 输出PATest

给定一个长度不超过 104 的、仅由英文字母构成的字符串。请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按 PATest 的顺序打印,直到所有字符都被输出。

输入格式:

输入在一行中给出一个长度不超过 104 的、仅由英文字母构成的非空字符串。

输出格式:

在一行中按题目要求输出排序后的字符串。题目保证输出非空。

输入样例:

redlesPayBestPATTopTeePHPereatitAPPT

输出样例:

PATestPATestPTetPTePePee

题解如下:

20/20

我先自己做了这个题, 我的思路是用对象存储各个字母出现的次数,再进行循环,每次循环先计算出出现次数的最小值,用repeat方法拼接结果字符串,出现次数为0的字母就从对象中删掉,直至对象为空则停止循环。

我写的时候自认为这个办法很好,觉得自己想出了这个循环真是聪明啊,然后就想对比一下别人的思路,查了一下发现大家好像都是直接循环输出的,简单粗暴,但是我就觉得不够优雅啊,我不信邪试了一下,发现人家的方法用的时间和空间都比我的方法小很多,我服了,还是人家的更好,so sad,我还是笨比

 我的思路:

/**
 * 2024/03/20
 * 20/20
 */
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
rl.on("line", function (data) {
  let str = data.match(/[PATest]/g);
  // 为了让key按指定的顺序排列,先预先定义好
  let strObj = {
    P: 0,
    A: 0,
    T: 0,
    e: 0,
    s: 0,
    t: 0,
  };
  // 统计字母出现次数
  for (let i = 0; i < str.length; i++) {
    strObj[str[i]]++;
  }
  let resStr = "";
  do {
    let strKeys = Object.keys(strObj);
    // 获取字母出现次数的最小值
    if (strKeys.length === 1) {
      resStr += strKeys[0].repeat(strObj[strKeys[0]]);
      break;
    }
    let min = strObj[strKeys[0]];
    for (const key in strObj) {
      if (strObj[key] < min) {
        min = strObj[key];
      }
    }
    // 拼接字符串
    resStr += strKeys.join("").repeat(min);
    // 计算剩下的字母
    for (const key in strObj) {
      strObj[key] -= min;
      if (strObj[key] === 0) {
        delete strObj[key];
      }
    }
  } while (JSON.stringify(strObj) !== "{}");
  console.log(resStr);
});

 网上的思路:

rl.on("line", function (data) {
  let strArr = new Array(6);
  strArr.fill(0);
  let resStr = "";
  // 统计字母出现次数以及总数
  // 过滤掉多余字母
  data = data.match(/[PATest]/g);
  let sum = 0;
  for (let i = 0; i < data.length; i++) {
    let el = data[i];
    if (el === "P") {
      strArr[0]++;
      sum++;
    } else if (el === "A") {
      strArr[1]++;
      sum++;
    } else if (el === "T") {
      strArr[2]++;
      sum++;
    } else if (el === "e") {
      strArr[3]++;
      sum++;
    } else if (el === "s") {
      strArr[4]++;
      sum++;
    } else if (el === "t") {
      strArr[5]++;
      sum++;
    }
  }
  while (1) {
    if (strArr[0]-- > 0) {
      resStr += "P";
      sum--;
    }
    if (strArr[1]-- > 0) {
      resStr += "A";
      sum--;
    }
    if (strArr[2]-- > 0) {
      resStr += "T";
      sum--;
    }
    if (strArr[3]-- > 0) {
      resStr += "e";
      sum--;
    }
    if (strArr[4]-- > 0) {
      resStr += "s";
      sum--;
    }
    if (strArr[5]-- > 0) {
      resStr += "t";
      sum--;
    }
    if (sum <= 0) break;
  }
  console.log(resStr);
});

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值