JS Leetcode 451. 根據字符出現頻率排序題解分析

JS Leetcode 451. 根據字符出現頻率排序題解分析

壹 ❀ 引

大前天作的一道題,昨天發版到11點,前天聚餐,一直沒時間整理,今天下班閒來無事,仍是作個簡單思路整理。本題來自LeetCode 451. 根據字符出現頻率排序,難度中等,其實整理下思路,其實並不算難,題目描述以下:數組

給定一個字符串,請將字符串裏的字符按照出現的頻率降序排列。數據結構

示例 1:ide

輸入:
"tree"

輸出:
"eert"

解釋:
'e'出現兩次,'r'和't'都只出現一次。
所以'e'必須出如今'r'和't'以前。此外,"eetr"也是一個有效的答案。

示例 2:優化

輸入:
"cccaaa"

輸出:
"cccaaa"

解釋:
'c'和'a'都出現三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正確的,由於相同的字母必須放在一塊兒。

示例 3:code

輸入:
"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轉爲數組,方便一點,原本覺得是暴力解法,最後看了下你們的思路,都大同小異,其實還擊敗了九十多的人,貼下代碼:get

/**
 * @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的寫法是這樣:string

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

其實經過||能夠簡化成一句,有就之前面的值爲準加1,沒有則取0加1做爲最初的值,至關人性化,那麼就記錄到這裏了。

相關文章
相關標籤/搜索