楼主朋友去某公司面试,遇到了下面这个面试题,本来楼主朋友就有解决方案,奈何面试官难为人。。。
题目:找出数组中出现次数最多的数和出现次数?不能使用循环!不能使用循环!不能使用循环!
楼主思考了半天。。。
思路:排序,取第一个元素,求出最后一个元素的位置,相减,得出个数,取上个元素最后的位置+1的元素,再求新元素的最后出现位置,相减。比较取大者,再继续下去,也就是递归。
代码实现:
<script>
//求数组中出现次数最多的那一个 不能用循环 indexOf lastIndexOf
var arrDemo = [1,2,3,4,5,6,7,6,4,3,3,3,3,5];
let arr = arrDemo.sort()
let cha = 0;
let num = null;
function abc(index) {
let start = arr.indexOf(arr[index])
let end = arr.lastIndexOf(arr[index])
if(end-start + 1 > cha) {
num = arr[index];
cha = end - start + 1;
}
if(end < arr.length -1) {
return abc(end + 1)
}else {
return {cha, num}
}
}
var obj = abc(0)
console.log('出现次数最多的为='+ obj.num+ ',次数为='+ obj.cha)//出现次数最多的为=3,次数为=5
</script>
但是上面的代码 有bug,当出现次数一样多的数的时候,只会显示第一个数!楼主进行了代码调整,如下
<script>
//求数组中出现次数最多的那一个 不能用循环 indexOf lastIndexOf
var arrDemo = [1,2,3,4,5,6,7,6,4,5];
let arr = arrDemo.sort()
let cha = 0;
let numArr = [];
function abc(index) {
let start = arr.indexOf(arr[index])
let end = arr.lastIndexOf(arr[index])
if(end-start + 1 > cha) {
numArr = [arr[index]]
cha = end - start + 1;
} else if(end - start + 1 == cha){
numArr.push(arr[index])
}
if(end < arr.length -1) {
return abc(end + 1)
}else {
return cha
}
}
var numCha = abc(0)
console.log('出现次数最多的为='+ numArr.toString()+ ',次数为='+ numCha) //出现次数最多的为=4,5,6,次数为=2
</script>