javascript - 如何提高Javascript/破解代码算法的性能?

标签 javascript arrays string algorithm performance

所以这是下面的问题,以及我的答案。我知道由于双重嵌套的for循环,效率是O(n^2),所以我想知道是否有办法提高我的算法/函数的大O。

//设计一个算法并编写代码来删除字符串中的重复字符,而不使用任何额外的缓冲区。注意:一两个附加变量就可以了。数组的额外副本不是。

function removeDuplicates(str) {
    let arrayString = str.split("");
    let alphabetArray = [["a", 0],["b",0],["c",0],["d",0],["e",0],["f",0],["g",0],["h",0],["i",0],["j",0],["k",0],["l",0],["m",0],["n",0],["o",0],["p",0],["q",0],["r",0],["s",0],["t",0],["u",0],["v",0],["w",0],["x",0],["y",0],["z",0]]

    for (let i=0; i<arrayString.length; i++) {
        findCharacter(arrayString[i].toLowerCase(), alphabetArray);
    }

    removeCharacter(arrayString, alphabetArray);
};


function findCharacter(character, array) {
    for (let i=0; i<array.length; i++) {
        if (array[i][0] === character) {
        array[i][1]++;
        }
    }
} 

function removeCharacter(arrString, arrAlphabet) {
    let finalString = "";
    for (let i=0; i<arrString.length; i++) {
        for (let j=0; j<arrAlphabet.length; j++) {
            if (arrAlphabet[j][1] < 2 && arrString[i].toLowerCase() == arrAlphabet[j][0]) {
            finalString += arrString[i]
            }
        }
      } 
    console.log("The string with removed duplicates is:", finalString)
}

removeDuplicates("Hippotamuus")

最佳答案

相同大小写的所有字母的 ASCII/Unicode 字符代码是连续的。这允许进行重要的优化:您可以从字符计数数组中的 ASCII/Unicode 字符代码找到字符的索引。具体来说,字符计数数组中字符 c 的索引将为 c.charCodeAt(0) - 'a'.charCodeAt(0)。这使您可以在 O(1) 时间内查找和修改数组中的字符计数,从而将算法运行时间缩短为 O(n)

关于javascript - 如何提高Javascript/破解代码算法的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52230752/

相关文章:

java - 查找两个字符串中的共同字母(Java)

c# - StartsWith 方法 C# 不返回 TRUE

javascript - 循环遍历 CSS 表格并对选定的单元格进行计数

javascript - 动态创建对象数组错误修复

c - 如何优化此代码并将正在读取的数据排序到数组中?

c++ - 循环询问用户输入数组

javascript - 如何在 c3js 中制作可重用/模板图表

javascript - 为什么固定导航会跳转?

arrays - 修改大型元胞数组以在 MATLAB 中查找满足条件的某些行

c# - 需要一些关于排序字符串列表的想法