找出陣列中移除的數與重複的數
阿新 • • 發佈:2018-12-11
題目描述: 陣列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);
}