可以更改此功能以提高效率吗?记忆和时间

时间:2017-09-28 20:18:25

标签: javascript ecmascript-6

我参加了一次面试,其中有一些代码练习。其中一个是编写一个函数,它可以采用数值数组并返回第一个重复的数字,或者在没有重复的情况下返回-1。我编写了以下函数来回答练习但效率却失败了。问题是,我没有得到足够的答案,所以对于一个学习点,有人可以帮助我更有效地编写这个功能。

function myFunc(arr) {
    for (var i = 0; i < arr.length; i++) {
        for (var x = 0; x < arr.length; x++) {
           if ((arr[i]==arr[x]) && ( i > x)) {
            return arr[i];
           }
        }
     }
     return -1;
 }

退货的例子:
arr = {8, 4, 6, 2, 6, 4, 7, 9, 5, 8} returns 6 arr = {2, 3, 3, 1, 5, 2} returns 3

3 个答案:

答案 0 :(得分:3)

就时间而言,你可以在O(n)中完成。遍历数组,并将值添加到表中。一旦你遇到已经添加到表中的那个,你就找到了你的副本。添加和检查表是O(1),因此算法的复杂性由循环支配,即O(n)

function myFunc(arr) {
    const table = {};
    for (let i = 0; i < arr.length; i++) {
        if (table[arr[i]] === true) {
            return arr[i];
        } else {
            table[arr[i]] = true;
        }
    }
    return -1;
}

console.log(myFunc([1, 2, 1, 3, 2]));

在ES6中,您可以使用Set而不是对象。

答案 1 :(得分:1)

您可以从i+1开始在x上循环,而不是检查代码中是否i>x

for ( x = i+1; x < arr.length; x++ )

答案 2 :(得分:0)

如何在搜索重复值之前对数据进行排序:

function MyFunc(arr)
{
    var sorted = arr.slice().sort();

    for (var i = 0; i < arr.length - 1; i++)
        if( sorted[i+1] == sorted[i] )
            return sorted[i];

    return -1;
}