[路飞]_451. 根据字符出现频率排序

208 阅读2分钟

451. 根据字符出现频率排序

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

「题目:」
 给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
「示例1:」
输入:
"tree"
​
输出:
"eert"
​
解释:
'e'出现两次,'r''t'都只出现一次。
因此'e'必须出现在'r''t'之前。此外,"eetr"也是一个有效的答案。
「示例2:」
输入:
"cccaaa"输出:
"cccaaa"解释:
'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正确的,因为相同的字母必须放在一起。
「示例3:」
输入:
"Aabb"输出:
"bbAa"解释:
此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
注意'A'和'a'被认为是两种不同的字符。

解题思路

从题目我们可以看出,本题是让我们按照字符出现的次数,由大到小进行一个排序,如果他们出现的次数相同的话,就不用在意字符执之间的顺序了;

  • 我们可以通过创建一个new map(),来保存当前的字符为key,当前字符出现的次数为value;
  • 把map转成arr的形式;
  • 对arr数组进行一个排序,这里要注意要对比的值是每一个数组的下标为1的值;
  • 最后我们可以用.repeat的方式对重复出现的字符进行重复的赋值操作,以便获取最后的结果;

代码实现

var frequencySort = function (s) {
  // 用来保存结果的变量
  let res = "";
  // 创建一个map
  const map = new Map();
  // 循环s字符串,获取每个字符出现的次数
  for (let i = 0; i < s.length; i++) {
    if (map.has(s[i])) { // 如果当前字符串已经存在的,说明不是第一次出现了
      map.set(s[i], map.get(s[i]) + 1); // 对已经出现过字符的value值做 + 1操作
    } else {
      map.set(s[i], 1); // 如果字符不存在,就对字符串进行初始化赋值为1;
    }
  }
​
  let arr = [...map]; // map 转为 array的形式
  arr.sort((a, b) => b[1] - a[1]); // 对arr数组进行排序 ps:这里要排序的是每一个数组里面下标为1的值
  for (let [val, times] of arr) {
    res += val.repeat(times); // 通过 repeat的方式对重复出现的字符进行重复的赋值操作;
  }
  return res;  // 最后返回结果变量
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;