当前位置: 面试刷题>> 最高频的k个单词 (经典算法题500道)
### 题目描述
给定一个字符串`s`,其中包含了由空格分隔的单词,以及一个整数`k`。请找出并返回字符串`s`中出现频率最高的`k`个单词。返回的单词列表需要按频率从高到低排序,如果频率相同,则按字典序从低到高排序。
**注意**:
1. 单词只由小写字母组成。
2. 你可以假设`k`总是有效的,即`k`小于等于单词列表中单词的总数。
### 示例
**输入**:
- 字符串`s`: "the day is sunny the the the windy day is beautiful"
- 整数`k`: 4
**输出**: ["the", "day", "is", "sunny"]
**解释**: "the" 出现了4次,"day" 和 "is" 各出现了2次,"sunny" 出现了1次。按频率排序后,"windy" 和 "beautiful" 不在结果中,因为它们只出现了1次。
### PHP 示例代码
```php
function topKFrequent($s, $k) {
$words = preg_split('/\s+/', strtolower($s)); // 使用正则分割单词并转为小写
$freq = array_count_values($words); // 统计每个单词的频率
arsort($freq); // 按频率降序排序,保持索引关联
$result = [];
foreach ($freq as $word => $count) {
$result[] = $word;
if (count($result) == $k) {
break;
}
}
// 如果需要按字典序排序相同频率的单词
uksort($result, function($a, $b) use ($freq) {
if ($freq[$a] == $freq[$b]) {
return strcmp($a, $b);
}
return 0;
});
return $result;
}
// 示例
$s = "the day is sunny the the the windy day is beautiful";
$k = 4;
print_r(topKFrequent($s, $k));
```
**注意**:由于PHP的`arsort`保持索引关联,直接对结果排序可能不会按字典序处理相同频率的单词。上述代码在最后使用`uksort`进行了补充排序,但这种方式可能不是最高效的。对于实际应用,可能需要先按频率分组,再在每个分组内按字典序排序。
### Python 示例代码
```python
from collections import Counter
def topKFrequent(s, k):
words = s.lower().split()
freq = Counter(words)
sorted_words = sorted(freq.items(), key=lambda x: (-x[1], x[0]))
return [word for word, _ in sorted_words[:k]]
# 示例
s = "the day is sunny the the the windy day is beautiful"
k = 4
print(topKFrequent(s, k))
```
### JavaScript 示例代码
```javascript
function topKFrequent(s, k) {
const words = s.toLowerCase().split(/\s+/);
const freq = {};
for (const word of words) {
if (freq[word]) {
freq[word]++;
} else {
freq[word] = 1;
}
}
const sortedWords = Object.entries(freq).sort((a, b) => {
if (a[1] === b[1]) {
return a[0].localeCompare(b[0]);
}
return b[1] - a[1];
});
return sortedWords.slice(0, k).map(word => word[0]);
}
// 示例
const s = "the day is sunny the the the windy day is beautiful";
const k = 4;
console.log(topKFrequent(s, k));
```
码小课网站中有更多相关内容分享给大家学习,包括但不限于算法解析、面试技巧、编程实践等,欢迎访问学习!