我正在创建一个从数组参数返回唯一整数的函数。我编写了一个可以正常工作的函数,但是它太慢了。该功能通过所有逻辑测试,但超时。
函数接受这样的参数:
[9,2,1,2,1,6,1,1,6,2,8,1,8]
我的功能:
function findUnique(numbers) {
let unqNumber, matchCount,i,y;
let len = numbers.length;
for (i = 0; i < len; i++ ) {
matchCount = 0;
for (y = 0; y < len; y++ ) {
if (numbers[i] == numbers[y]) {
matchCount++;
}
}
if (matchCount == 1) {
unqNumber = numbers[i]
}
}
return unqNumber;
}
它将每个索引与所有其他索引进行比较,并对出现的次数进行计数。只有1次出现的索引是唯一编号。
传入的数组中始终只有一个唯一编号。
我知道for循环效率低下,但我不知道另一种编写方式。我可以使用filter()或map()更快,更有效地完成此任务吗?
答案 0 :(得分:1)
使用哈希图。您代码的当前复杂度为O(n * n)。使用哈希图,它将为O(n)。
例如)
var temp = [9,2,1,2,1,6,1,1,6,2,8,1,8];
function findUnique(numbers)
{
let unqNumber,i;
let len = numbers.length;
var mymap = {};
for(i = 0; i < len; i++)
{
if(numbers[i] in mymap)
{
mymap[numbers[i]]++;
}
else
{
mymap[numbers[i]] = 1;
}
}
console.log(mymap);
//{1: 5, 2: 3, 6: 2, 8: 2, 9: 1}
for(var j in mymap)
{
if(mymap[j] == 1)
{
unqNumber = j;
}
}
return unqNumber;
}
console.log(findUnique(temp));
//9
答案 1 :(得分:0)
在这里,您可以跟踪唯一身份信息和多次出现的数字:
input = [9,2,1,2,1,6,1,1,6,2,8,1,8];
function getUniques(array) {
doubles = [];
uniques = [];
for (var i = 0; i < array.length; i++) {
if(doubles.indexOf(array[i]) != -1) {
continue;
} else if(uniques.indexOf(array[i]) == -1) {
uniques.push(array[i]);
} else {
doubles.push(uniques.splice(uniques.indexOf(array[i]),1)[0]);
}
}
return uniques;
}
console.log(getUniques(input)[0]);
您可以尝试类似的方法。您获得每个元素并将其视为唯一元素,或者从数组中删除所有相同的项目,直到找到唯一的元素为止。 如果有多个唯一项目,则返回第一个。
input = [9,2,1,2,1,6,1,1,6,2,8,1,8];
function findFirstUnique(array) {
while(array.length > 0) {
i = array.splice(0,1)[0];
next = array.indexOf(i);
if(next == -1) {
return i;
}
while(next != -1) {
array.splice(next,1);
next = array.indexOf(i);
}
}
}
console.log(findFirstUnique(input))