MST

星途 面试题库

面试题:JavaScript字符串处理与性能优化

有一个非常大的文本字符串,里面包含了大量的单词,单词之间用空格分隔。现在要统计每个单词出现的次数,并按照出现次数从高到低排序(如果出现次数相同,则按字典序排序)。请编写一个高效的JavaScript函数来实现此功能,并阐述在处理大数据量字符串时,你采取的性能优化策略。
24.2万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
function countAndSortWords(str) {
    const wordCount = {};
    const words = str.split(' ');
    for (const word of words) {
        if (wordCount[word]) {
            wordCount[word]++;
        } else {
            wordCount[word] = 1;
        }
    }

    const wordArray = Object.entries(wordCount).map(([word, count]) => ({ word, count }));
    wordArray.sort((a, b) => {
        if (a.count!== b.count) {
            return b.count - a.count;
        } else {
            return a.word.localeCompare(b.word);
        }
    });

    return wordArray.map(({ word, count }) => ({ word, count }));
}

性能优化策略

  1. 使用对象存储单词计数:利用JavaScript对象的快速查找特性,通过哈希表的方式存储每个单词及其出现次数,这样在统计单词出现次数时,每次查找操作的时间复杂度为O(1),而不是使用数组进行线性查找(时间复杂度为O(n))。
  2. 减少中间数据存储:在统计完单词次数后,直接将对象转换为数组进行排序,避免创建过多不必要的中间数据结构,减少内存消耗。
  3. 高效的排序算法:JavaScript的Array.prototype.sort方法内部实现通常是一种优化过的排序算法(例如V8引擎使用的是TimSort),它在处理大规模数据时具有较好的性能。通过自定义比较函数,先按出现次数从高到低排序,次数相同再按字典序排序,保证排序的正确性和高效性。
  4. 分批处理:如果字符串过大导致一次性处理内存不足,可以考虑将字符串按一定规则(如固定长度)分割成多个小部分,分别进行单词统计,最后再合并统计结果并排序。