鑱婂ぉ鏁版嵁鍒嗘瀽锛氬浣曠粺璁$ぞ缇や腑鏈€娲昏穬鐨勭敤鎴?/h1>

涓€銆佷笟鍔″満鏅?/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]);
    }
}

浜斻€佸簲鐢ㄥ満鏅?/h2>
  • 绀剧兢杩愯惀锛氳瘑鍒獽OL鍜屾椿璺冩垚鍛?/li>
  • 瀹㈡湇鍒嗘瀽锛氱粺璁″搷搴旀渶澶氱殑瀹㈡湇浜哄憳
  • 璁哄潧绠$悊锛氬彂鐜伴珮浜у嚭鍐呭璐$尞鑰?/li>
  • 瀹炴椂鐩戞帶锛氭娴嬪紓甯告椿璺冭处鍙凤紙鍙兘鏄満鍣ㄤ汉锛?/li>
TopK闂 鍝堝笇琛?/span> 鍫嗘帓搴?/span> 鏁版嵁鍒嗘瀽