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 中的 HOC 和 Hooks
前端·javascript·react.js·hooks·高阶组件·hoc
知识分享小能手12 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
luckys.one12 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
魔云连洲12 小时前
深入解析:Vue与React的异步批处理更新机制
前端·vue.js·react.js
mCell12 小时前
JavaScript 的多线程能力:Worker
前端·javascript·浏览器
~|Bernard|13 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师13 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo313 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
weixin_4378309414 小时前
使用冰狐智能辅助实现图形列表自动点击:OCR与HID技术详解
开发语言·javascript·ocr
超级无敌攻城狮14 小时前
3 分钟学会!波浪文字动画超详细教程,从 0 到 1 实现「思考中 / 加载中」高级效果
前端