var arr = [2,10,9,8,4,5,1,6],ret = new Array(11),len = arr.length,dd,aa = [];
for(var i = 0;i<len;i){
dd = arr[i];
ret[dd] = 1;
}
len = ret.length
for(var j = 0;j<len;j){
if(!ret[j]) aa.push(j);
}
aa.shift();
console.log(aa) // [3,7]
比较好的算法是时间复杂度是o(n),空间复杂度是o(1)的。有两个:1.3楼的方法。2.用异或性质解。
方法1的常数时间小,较优,个人实现如下:
var num=1e2, inputArray=[], deleted, i=num; while(i){ inputArray[i-1]=i; i--; } inputArray.sort(function(){ return Math.random()-0.5; }); deleted=inputArray.splice(0,2); function sumAndSqirt(){ var n=0, m=0, i=num-2, foundDelete=[]; while(i--){ n+=inputArray[i]; m+=inputArray[i]*inputArray[i]; } n=(1+num)*num/2-n; m=num*(num+1)*(2*num+1)/6-m; foundDelete.push((n+Math.sqrt(2*m-n*n))/2); foundDelete.push(n-foundDelete[0]); } sumAndSqirt();
感谢@guokai 给我们提供这么好的交流社区,及开源代码供学习。
©2012-2013 F2E.im Powered by Tornado on Linode , All rights reserved.
Bitcoin Donation: 1MqzGbsAufs3gCFEqqTM9WBNnRmVFu7HWH