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);
});
相关推荐
奇迹_h1 小时前
打造你的HTML5打地鼠游戏:零基础入门实践
前端
SuperEugene1 小时前
Vue生态精选篇:Element Plus 的“企业后台常用组件”用法扫盲
前端·vue.js·面试
千寻girling1 小时前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
Neptune11 小时前
JavaScript回归基本功之---类型判断--typeof篇
前端·javascript·面试
贾铭1 小时前
如何实现一个网页版的剪映(三)使用fabric.js绘制时间轴
前端·后端
进击的尘埃1 小时前
微前端沙箱隔离:qiankun 和 wujie 到底在争什么
javascript
子兮曰2 小时前
后端字段又改了?我撸了一个 BFF 数据适配器,从此再也不怕接口“屎山”!
前端·javascript·架构
万少4 小时前
使用Trae轻松安装openclaw的教程-附带免费token
前端·openai·ai编程
颜酱5 小时前
一步步实现字符串计算器:从「转整数」到「带括号与优化」
javascript·后端·算法
浪浪山_大橙子5 小时前
OpenClaw 十分钟快速,安装与接入完全指南 - 推荐使用trae 官方 skills 安装
前端·人工智能