比较好的算法是时间复杂度是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 给我们提供这么好的交流社区,及开源代码供学习。