JavaScript PAT乙级题解 1043 输出PATest

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

输入格式:

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

输出格式:

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

输入样例:

redlesPayBestPATTopTeePHPereatitAPPT

输出样例:

PATestPATestPTetPTePePee

题解如下:

20/20

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

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

我的思路:

javascript 复制代码
/**
 * 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);
});

网上的思路:

javascript 复制代码
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);
});
相关推荐
浮华似水10 分钟前
简洁之道 - React Hook Form
前端
hsling松子12 分钟前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui12337 分钟前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝38 分钟前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O1 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King2 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家2 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain2 小时前
算法 | 位运算(哈希思想)
算法
正小安2 小时前
如何在微信小程序中实现分包加载和预下载
前端·微信小程序·小程序
Kalika0-04 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法