题解 | #名字的漂亮度#
名字的漂亮度
https://www.nowcoder.com/practice/02cb8d3597cf416d9f6ae1b9ddc4fde3
const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); /** * 字符串的漂亮度是所有字符的漂亮度之和,字符串仅由小写字母组成 * 1、每个字母独有一个漂亮度在 1~26之间,没有任何一个字母额漂亮度是一样的 * 2、给出多个字符串,计算字符串的最大可能的漂亮度 * a、b、c、d、e、f、g、h、i、j、k、l、m、n、o、p、q、r、s、t、u、v、w、x、y、z * 看题目的说明解释,猜测题目的意思 * 对于lisi, 按照字母顺序 i 最小其漂亮度是 26 ,接着 l 25 s 24 * 所以lisi = 25 + 26 + 24 + 26 = 101漂亮度 * 为了验证想法,按照上面的规则计算一下zhangsan 看看 * 按照书字母顺序排一下,可得, 规则就是,出现次数最多的,就安排其漂亮度最大 26,其他的其次 * a a n n g h s z * 26 26 25 25 24 23 22 21 * 上面和为 */ let [row, rowNum, str1, str2] = [0, 0,'', ''] rl.on('line', function (line) { row++ if(row === 1){ rowNum = Number(line) }else if(row > 1 + rowNum ){ row = 0 }else if(row > 1){ getNameBeauty(line) } }); // 封裝一個方法计算字符串的漂亮度 function getNameBeauty(str: string){ // 首先将所有字符转小写或大写也可以,因为题目说,忽略大小写 str = str.toLocaleLowerCase() // 统计每个字符串出现次数,目前想到的比较好的办法就是键值对, // 那就可以使用对象来处理了 const strArr = str.split('') const charObj = {} for(let i = 0; i < strArr.length; i++){ if(charObj[strArr[i]]){ charObj[strArr[i]]++ }else { charObj[strArr[i]] = 1 } } // 计算每个字符的漂亮度 // 出现次数最多的给最大值26 其他的一次递减 25 24 23... const values = Object.values(charObj).sort((a:number,b:number)=>b-a) as any let beauty = 0 for(let j = 0; j < values.length; j++){ beauty += values[j] * (26 - j) } console.log(beauty) }