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; // 最后返回结果变量
};
如果你对这道题目还有疑问的话,可以在评论区进行留言;