• JS Leetcode 451. 根据字符出现频率排序题解分析


    壹 ❀ 引

    大前天做的一道题,昨天发版到11点,前天聚餐,一直没时间整理,今天下班闲来无事,还是做个简单思路整理。本题来自LeetCode 451. 根据字符出现频率排序,难度中等,其实整理下思路,其实并不算难,题目描述如下:

    给定一个字符串,请将字符串里的字符按照出现的频率降序排列。

    示例 1:

    输入:
    "tree"
    
    输出:
    "eert"
    
    解释:
    'e'出现两次,'r'和't'都只出现一次。
    因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
    

    示例 2:

    输入:
    "cccaaa"
    
    输出:
    "cccaaa"
    
    解释:
    'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。
    注意"cacaca"是不正确的,因为相同的字母必须放在一起。
    

    示例 3:

    输入:
    "Aabb"
    
    输出:
    "bbAa"
    
    解释:
    此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
    注意'A'和'a'被认为是两种不同的字符。
    

    贰 ❀ 题解分析

    题意很简单,给定一个字符串,请统计字符串中每种字符出现的次数,并按照由高到低的顺序重组字符并返回,比如tree可以返回为eetr或者eert,也就是说出现次数相同的字符不用考虑先后顺序,前面两种答案均符合条件。

    直观思路其实很简单,统计每个字符出现的次数,比如't:1','r:1','e:2',然后对其进行排序,数字越高的在前面,最后我们再进行字符重组,比如e有2个,因此相加2次,依次操作得到最终字符。

    那么问题就来了,我们使用什么数据结构来统计字符的次数呢?直觉可能想到的是对象,比如:

    let map = {
      t:1,
      r:1,
      e:2
    }
    

    望着统计完成后对象,排序又成了问题....倒不是不能排,而是有点麻烦。所以思考了下,还是选用map结构,理由是我们可以通过...直接将map转为数组,方便一点,本来以为是暴力解法,最后看了下大家的思路,都大同小异,其实还击败了九十多的人,贴下代码:

    /**
     * @param {string} s
     * @return {string}
     */
    var frequencySort = function (s) {
      	// 用来统计字符次数用
        let map = new Map();
        let res = '';
        for (let k = 0; k < s.length; k++) {
            map.set(s[k], (map.get(s[k]) || 0) + 1)
        }
      	// 排序,让字符多的在前面
        let arr = [...map].sort((a, b) => {
            return b[1] - a[1];
        });
      	// 字符串重组
        for (let i = 0; i < arr.length; i++) {
            while (arr[i][1] > 0) {
                res += arr[i][0];
                arr[i][1]--;
            }
        }
        return res;
    };
    

    其实这里有个代码简写的优化点,我最初对于判断map中是否包含了某个字符,没有设置为1,有则加1的写法是这样:

    if (map.get(s[k])) {
        map.set(s[k], map.get(s[k]) + 1)
    } else {
        map.set(s[k], 1);
    }
    

    其实通过||可以简化成一句,有就以前面的值为准加1,没有则取0加1作为最初的值,相当人性化,那么就记录到这里了。

  • 相关阅读:
    JS如何获取并操作iframe中的元素?
    CSS(14)元素定位
    C#基础 [01] 从Hello World 开始
    CSS(15)浮动
    C#基础 [05] 类和对象
    关于Visual Studio 2010 编辑器的一些设置
    Ext JS(1)Ext JS简介
    C#基础 [03] 类型和成员
    Python中基本数据类型的学习
    Python:集合与字符串格式化
  • 原文地址:https://www.cnblogs.com/echolun/p/15017517.html
Copyright © 2020-2023  润新知