我参加了一次面试,其中有一些代码练习。其中一个是编写一个函数,它可以采用数值数组并返回第一个重复的数字,或者在没有重复的情况下返回-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
答案 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;
}