题解 | #名字的漂亮度#

名字的漂亮度

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)
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 18:30
点赞 评论 收藏
分享
07-01 23:23
郑州大学 Java
否极泰来来来来:牛客迟早有高三的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务