Javascript 数组中的第一个唯一编号。需要优雅的解决方案
嗨,伙计们。我被要求创建一个函数,从给定的整数数组返回第一个唯一的整数。如果成功,函数将返回唯一的数字;如果失败,函数将返回-1。复杂度应该是O(N*log(N)) 我的解决办法是:Javascript 数组中的第一个唯一编号。需要优雅的解决方案,javascript,Javascript,嗨,伙计们。我被要求创建一个函数,从给定的整数数组返回第一个唯一的整数。如果成功,函数将返回唯一的数字;如果失败,函数将返回-1。复杂度应该是O(N*log(N)) 我的解决办法是: function solution(A) { var returnNumber = -1; var tempArray = new Array();; for(i=0; i < A.length; i++){ var newIndex = A[i]; if(
function solution(A) {
var returnNumber = -1;
var tempArray = new Array();;
for(i=0; i < A.length; i++){
var newIndex = A[i];
if( tempArray[newIndex] === undefined){
tempArray[newIndex] = 1;
}
else{
tempArray[newIndex] += 1;
}
}
for(j = 0; j < A.length; j++){
if(tempArray[A[j]] == 1){
returnNumber = A[j];
break;
}
}
return returnNumber;
}
//var A = [1, 4, 3, 3, 1, 2, 0, 0]; //returns 4
var A = [22, 25, 3, 3, 1, 2, 0, 0,100,22,25,1,2]; // returns 100
solution(A)
函数解决方案(A){
var returnNumber=-1;
var tempArray=新数组();;
对于(i=0;i
有人能创造出更优雅的解决方案吗?欢迎发表任何意见。1)复制数组(O(N))
2) 编写快速排序以对副本排序(O(N*log(N)),然后:
3) 通过以下方式搜索第一个唯一项:
- 非排序数组上的循环
- 对于每个元素,使用二进制搜索算法(O(log(N))查找其在排序数组中的位置
- 只需检查下一个元素是否也具有相同的值O(1) 当您找到第一个未复制的时,请停止
// checks for duplictes before and after current node
function find1 (ls) {
return ls.find(function (n, idx, ls) {
return (idx == ls.indexOf(n)) && (-1 == ls.indexOf(n, idx + 1));
});
}
在我看来,它看起来足够优雅,而且性能也相当不错。这可能更适合于。这个函数实际上是
O(n)
…如果我不是在做梦,几分钟前我看到了一位知名会员的回答!@volkinc说这不是O(N*log(N)),他反对。答案在哪里?一位有名望的议员这样简单地删除他的答案,是不能接受的。如果有人有他的名字,让我来投诉他的行为。他很有声望,所以他的投票可能会让其他人失望。他应该谦虚地接受自己的错误。你介意解释一下为什么这是一个答案吗?这将大大增加它的价值。答案应该是JSThis返回3
,而不是100
@innoSPG:最坏的情况,是的;最好的情况是O(N*log(N))@publicoverride,最好的情况是O(N),(比O(N*log(N))更好)当第一个唯一值位于位置1时,我们在现实生活中会遇到多少次这种情况?对于您的算法,在复杂性研究中使用的大多数时间的平均情况是O(N^2)。想想看。