力扣之:检查是否所有字符出现次数相同&将句子排序

76 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情 >>

题目描述~检查是否所有字符出现次数相同

给你一个字符串 s ,如果 s 是一个  字符串,请你返回 true ,否则请返回 false 。

如果 s 中出现过的 所有 字符的出现次数 相同 ,那么我们称字符串 s 是  字符串。

示例 1:

输入:s = "abacbc"
输出:true
解释:s 中出现过的字符为 'a''b''c' 。s 中所有字符均出现 2 次。

示例 2:

输入:s = "aaabb"
输出:false
解释:s 中出现过的字符为 'a''b''a' 出现了 3 次,'b' 出现了 2 次,两者出现次数不同。

力扣原题目地址:leetcode.cn/problems/ch…

解法代码

var areOccurrencesEqual = function (s) {
    // 依然是熟悉的map集合统计次数
    let map = new Map()
    for (let i = 0; i < s.length; i++) {
        let item = s[i]
        if (map.has(item)) {
            let count = map.get(item)
            count = count + 1
            map.set(item, count)
        } else {
            map.set(item, 1)
        }
    }
    // 次数统计好了以后,再看是不是map集合中的每一项value都相等
    let flag = true // 假设每一项都相等
    let val = null // 定义一个初始值为null,后续用于比较
    for (const [key, value] of map) { // 使用forof遍历map集合
        // 这个if是初始去赋值,取第一项的value的值
        if (val == null) {
            val = value
        }
        // 这个是后续所有项的,再看后续项是否和第一项相等
        else {
            if (val != value) { // 只要有一个不相等就返回false,即不用继续比较了
                return false
            }
        }
    }
    // 若操作了一波没有变化,即为true
    return flag
};

提交结果图

leetcode.png

题目描述~将句子排序

一个 句子 指的是一个序列的单词用单个空格连接起来,且开头和结尾没有任何空格。每个单词都只包含小写或大写英文字母。

我们可以给一个句子添加 从 1 开始的单词位置索引 ,并且将句子中所有单词 打乱顺序 。

比方说,句子 "This is a sentence" 可以被打乱顺序得到 "sentence4 a3 is2 This1" 或者 "is2 sentence4 This1 a3" 。 给你一个 打乱顺序 的句子 s ,它包含的单词不超过 9 个,请你重新构造并得到原本顺序的句子。

 示例 1:

输入:s = "is2 sentence4 This1 a3"
输出:"This is a sentence"
解释:将 s 中的单词按照初始位置排序,得到 "This1 is2 a3 sentence4" ,然后删除数字。

示例 2:

输入:s = "Myself2 Me1 I4 and3"
输出:"Me Myself and I"
解释:将 s 中的单词按照初始位置排序,得到 "Me1 Myself2 and3 I4" ,然后删除数字。

解法代码一

var sortSentence = function (s) {
    let sArr = s.split(' ') // 首先把字符串转成数组,因为要排序
    sArr.sort((a, b) => { // 注意这里的排序规则是最后一个字符,如Myself2 即2
        return a.at(-1) - b.at(-1) // 这样的话,就可以按照从1~9排序了
    })
    let res = "" // 准备一个变量字符串用于存储结果
    for (let i = 0; i < sArr.length; i++) { // 循环拼接得到结果
        // 注意,这里使用slice方法截取一下,因为字符串最后一个字符是数字,是不要的
        res = res + ' ' + sArr[i].slice(0, -1) 
    }
    return res.trimStart() // 最后再去掉左侧空格返回即可
};

提交结果图一

001.png

解法代码二

其实也不算另外一种解法,只是,把上方的循环拼接换成reduce函数,这样操作以后,我们会发现,性能稍微提升一点点。所以,一般情况下,优先使用reduce函数做操作

var sortSentence = function (s) {
    let sArr = s.split(' ') // 转数组
    sArr.sort((a, b) => { // 按照单词最后一个数字排序
        return a.at(-1) - b.at(-1)
    })
    let res = sArr.reduce((temp, item) => { // reduce加工
        return temp + " " + item.slice(0, -1) // 字符串最后的一个数字字符不要
    }, '')
    return res.trimStart() // 去掉左侧空格
};

提交结果图二

002.png

对比一下两张提交的图片,我们发现,的确是reduce函数貌似性能好一点点