一道简单的算法题

题目:有一组数字,从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的中不存在哪个数值,也就是那些被删除的。


转载于:https://my.oschina.net/u/2618661/blog/632300

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值