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);
});
相关推荐
此乃大忽悠2 分钟前
XSS(ctfshow)
javascript·web安全·xss·ctfshow
<但凡.2 分钟前
数据结构与算法之美:广义表
数据结构·c++·算法
用户990450177800910 分钟前
告别广告干扰,体验极简 JSON 格式化——这款工具让你专注代码本身
前端
前端极客探险家13 分钟前
告别卡顿与慢响应!现代 Web 应用性能优化:从前端渲染到后端算法的全面提速指南
前端·算法·性能优化
程序员Xu1 小时前
【OD机试题解法笔记】连续出牌数量
笔记·算法·深度优先
CoovallyAIHub1 小时前
单目深度估计重大突破:无需标签,精度超越 SOTA!西湖大学团队提出多教师蒸馏新方案
深度学习·算法·计算机视觉
袁煦丞1 小时前
【局域网秒传神器】LocalSend:cpolar内网穿透实验室第418个成功挑战
前端·程序员·远程工作
江城开朗的豌豆1 小时前
Vuex数据突然消失?六招教你轻松找回来!
前端·javascript·vue.js
CoovallyAIHub1 小时前
从FCOS3D到PGD:看深度估计如何快速搭建你的3D检测项目
深度学习·算法·计算机视觉
好奇心笔记1 小时前
ai写代码随机拉大的,所以我准备给AI出一个设计规范
前端·javascript