# NC97.字符串出现次数的TopK问题

# 描述

给定一个字符串数组,再给定整数 k ,请返回出现次数前k名的字符串和对应的次数。返回的答案应该按字符串出现频率由高到低排序。如果不同的字符串有相同出现频率,按字典序排序。

对于两个字符串,大小关系取决于两个字符串从左到右第一个不同字符的 ASCII 值的大小关系。

比如"ah1x"小于"ahb","231"<”32“,字符仅包含数字和字母

# 示例1

输入:["a","b","c","b"], 2
返回值:[["b","2"],["a","1"]]
说明: "b"出现了2次,记["b","2"],"a"与"c"各出现1次,
但是a字典序在c前面,记["a","1"],最后返回[["b","2"],["a","1"]]
1
2
3
4

# 示例2

输入:["123","123","231","32"], 2
返回值:[["123","2"],["231","1"]]
说明:"123"出现了2次,记["123","2"],"231"与"32"各出现1次,
但是"231"字典序在"32"前面,记["231","1"],最后返回[["123","2"],["231","1"]]   
1
2
3
4

# 示例3

输入:["abcd","abcd","abcd","pwb2","abcd","pwb2","p12"],3
返回值:[["abcd","4"],["pwb2","2"],["p12","1"]]
1
2

# 题解:

/**
 * return topK string
 * @param strings string字符串一维数组 strings
 * @param k int整型 the k
 * @return string字符串二维数组
 */
function topKstrings(strings, k) {
  // 创建一个对象
  let obj = {};
  // 结果数组
  let res = [];
  // 将给定的数组排序
  strings.sort();
  
  // 遍历给定的数组
  for (let i = 0; i < strings.length; i++) {
    // 判断对象中有这个元素 这个元素 数值加1
    if (obj.hasOwnProperty(strings[i])) {
      obj[strings[i]]++;
    } else {
      // 否则将这个key变为1
      obj[strings[i]] = 1;
    }
  }
  
  // 将所有的元素映射之后 遍历对象 构造二维数组
  for (var key in obj) {
    let arr2 = [];
    arr2.push(key, obj[key]);
    res.push(arr2);
  }
  // 构造完毕数组之后 对最终的结果进行二次排序
  res.sort(function (a, b) {
    if (a[1] == b[1]) {
      if (a[0] < b[0]) return -1;
      else return 1;
    } else {
      return b[1] - a[1];
    }
  });
  // 截取前k个
  res.splice(k);
  // 返回结果
  return res;
}
module.exports = {
  topKstrings: topKstrings,
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
最后更新时间: 11/26/2022, 4:35:21 PM