题目:有一组数字,从1到n(此例子假设n=10),乱序且不存在重复的数字。例如:[8,9,2,3,6,1,4,5,7,10]。从中任意删除了3个数,顺序也再次被打乱,将这些剩余数字放在一个n-3的数组里,请找出丢失的数字,要求算法比较快。
//获取乱序数组
var arr=[1,2,3,4,5,6,7,8,9,10];
function randomSort(a,b){
return Math.random()>0.5?-1:1;
}
Array.prototype.ransort=function(){
return this.sort(randomSort);
};
// console.log(arr.ransort());
// console.log(arr);
//获取丢失数字后的数组
var tempArr=[];
arr[3]=undefined;
arr[7]=undefined;
arr[5]=undefined;
console.log(arr);
for(var i=0;i<10;i++){
if(arr[i]){
tempArr.push(arr[i]);
}
}
console.log(tempArr);
//找出丢失的数字
var newArr= new Array(11);
var lostArr=[];
for(var j=0;j<7;j++){
newArr[tempArr[j]]=1;
}
console.log(newArr);
for(var m=0;m<11;m++){
if(newArr[m]===undefined){
lostArr.push(m);
}
}
lostArr.shift(0);
console.log(lostArr);
原理就是,创建一个newArray,长度为11。(由于新数组没有定义具体的元素,所以所有元素默认为undefined)。把删除后的数组oldArray里的元素,按照他的值来设置newArray的相应位置。
比如说,old里的第一个元素是5,那么就把newArr[5]的位置设置为1,old的元素值现在也当做new的数组下标,当old元素存在,那么new的相应位置的元素就是1,old中不存在的,new中相应是
undefined(就是101010101010的是非模式)。所以,遍历new,哪个下标的元素是undefined,就证明old的中不存在哪个数值,也就是那些被删除的。