题目描述:
数组arr为一乱序数组,但排序后是[1,2,3,4,5,…,n-1,n];
从其中随机取出一个数,再随机将其中的一个数重复,数组大小还是为n,请设计一个O(n)的算法,找出取出的数与移除的数。
例如:
输入:6 4 5 1 5 3
输出:2(移除的数),5(重复的数)
思路:
-
如果先将数组排序的话,可以很容易的找到了,可是排序算法时间复杂度最低为O(nlogn),不符合题目的O(n)要求。
-
可以利用数组下标唯一的方法,将数组值作为下标创建新数组O(n),数组值的出现次数作为新数组的值。
-
最后遍历一次新数组 ( O(n) )就可以得到答案了
function find(arr){
var hash_arr=[];
var len=arr.length;
for(var i=0;i<len;i++){//统计各个数字的出现次数
hash_arr[arr[i]-1] == undefined ?
hash_arr[arr[i]-1]=1 :
hash_arr[arr[i]-1]=hash_arr[arr[i]-1]+1;
}
var del_num,dup_num;
for(var i=0;i<len;i++){
if(hash_arr[i]==undefined){//此值即为移除的数字
del_num=i+1;
}
if(hash_arr[i]==2){//出现两次,为重复的次数
dup_num=i+1;
}
}
console.log(del_num,dup_num);
}