涓€銆佷笟鍔″満鏅?/h2>
鍦ㄧぞ浜ゅ钩鍙板拰鍦ㄧ嚎绀惧尯涓紝璇嗗埆鏈€娲昏穬鐢ㄦ埛鏄繍钀ュ垎鏋愮殑閲嶈闇€姹傘€傛湰鏂囨帰璁ㄥ浣曚粠鑱婂ぉ鏃ュ織涓珮鏁堟彁鍙?璇濇渶澶?鐨勫墠N涓敤鎴枫€?/p>
浜屻€侀棶棰樺畾涔?/h2>
缁欏畾鑱婂ぉ鏃ュ織瑙f瀽缁撴灉锛屾瘡鏉¤褰曞寘鍚敤鎴峰悕鍜屾秷鎭瘝鏁帮紝杩斿洖鎸夋€昏瘝鏁版帓搴忕殑鍓峃涓渶娲昏穬鐢ㄦ埛銆?/p>
// 鏃ュ織鏍煎紡绀轰緥
09:15 <alice> 鏃╀笂濂斤紒 // alice: 2璇?
09:16 <bob> 鏃╋紒 // bob: 1璇?
09:20 <alice> 浼氳鏀瑰埌涓嬪崍浜? // alice: 5璇?
// 鏈熸湜杈撳嚭鍓?娲昏穬鐢ㄦ埛: ["alice", "bob"]
涓夈€佽В娉曪細鍝堝笇琛?+ 鎺掑簭
function getTopTalkers(
messages: Array<{username: string, wordCount: number}>,
topN: number
): string[] {
// 姝ラ1锛氬搱甯岃〃绱姣忎釜鐢ㄦ埛璇嶆暟
const wordCountMap = new Map<string, number>();
for (const {username, wordCount} of messages) {
const current = wordCountMap.get(username) || 0;
wordCountMap.set(username, current + wordCount);
}
// 姝ラ2锛氭寜璇嶆暟闄嶅簭鎺掑簭
const sorted = Array.from(wordCountMap.entries())
.sort((a, b) => b[1] - a[1]);
// 姝ラ3锛氳繑鍥炲墠N涓敤鎴峰悕
return sorted.slice(0, topN).map(([name]) => name);
}
鈴憋笍 澶嶆潅搴︼細鏃堕棿 O(m + n log n)锛岀┖闂?O(n)銆俶涓烘秷鎭暟锛宯涓虹敤鎴锋暟銆?
鍥涖€佷紭鍖栵細灏忛《鍫嗗鐞嗘捣閲忔暟鎹?/h2>
褰撶敤鎴锋暟n杩滃ぇ浜庨渶瑕佺殑k鏃讹紝缁存姢澶у皬涓簁鐨?strong>灏忛《鍫?/strong>鏇撮珮鏁堬紝鏃堕棿澶嶆潅搴﹂檷涓篛(m + n log k)銆?/p>
// 鏍稿績閫昏緫
for (const [user, count] of wordCountMap) {
if (heap.size < k) {
heap.push([user, count]);
} else if (count > heap.peek()[1]) {
heap.pop();
heap.push([user, count]);
}
}