js:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

       例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

一、解题思路

1.定义一个辅助数组 zero ,里面全是0;

2.循环输入的数组 arr ,将 arr 每个位置的值(arr[i])对应到辅助数组zero里的每个位置,使之++。

    即 如果arr[1]的值是2,就对应到zero[2],使zero[2]的值++;……;如果arr[5]的值又是2,就再对应到zero[2],使zero[2]的值++;

3.循环辅助数组 zero,将其中的数与 arr长度的一半作比较,如果大於则输出该数的位置。即如果 arr.length/2 == 3,zero[3] == 4,则输出3。

 

二、代码

function arrCount(arr){
	var count = arr.length/2;
	var zero = [0];
	var res = 0;
	if (arr.length == 0) {
		console.log("This arr is null!");
		return;
	}
	// 辅助数组的长度应该等于原数组中的最大值
	for(let i = 0; i <= Math.max.apply(null,arr); i++){
		zero[i] = 0;
	}
	for(let i = 0; i < arr.length; i++){
		var j = arr[i];
		zero[j]++;
	}
	for(let i = 0; i < zero.length; i++){
		if (zero[i]>count) {
			res = i;
		}
	}
	console.log(res);
	// console.log(zero);
}
var arr = [1,2,1,7,7,7,7,8,7,7];
arrCount(arr);

三、其他

我觉得用HashMap做也可以,key为数组的数字,value为数字重复的次数,最后找出重复次数最多的那个,再将value的值与arr.length/2进行对比即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章