找出数组中移除的数与重复的数

题目描述:
数组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);
}

猜你喜欢

转载自blog.csdn.net/weixin_42420703/article/details/82797296