大前天作的一道題,昨天發版到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做爲最初的值,至關人性化,那麼就記錄到這裏了。