今天有一道面试题就是这个问题,然后我自己的解决方法是这样的:
var findMost = function(arr){
let arrL=[],arrN=[],count=1;
//定义两个数组 一个存出现次数 一个存出现的数 顺带定义一个初始出现次数1
for(const i of arr.keys()){
for(var j = i+1;j<arr.length;j++){
if(arr[i]==arr[j]){
count++;//如果和后面的值相同 就将出现次数+1
arr.splice(arr[j],1);//删掉后面这个值相同的
j=j-1;//将j往前移一位 不然会出现少循环的问题
}
}
if(j==arr.length){
//判断j如果j==arr.length说明就是第二个循环完成了 这个时候就可以存储这个循环的值了
arrL.push(count);
arrN.push(arr[i]);
count = 1;//初始出现次数count
}
}
console.log(arrL,arrN);//打印各个数出现的次数
//接下来判断arrL数组中最大的值了
maxL = arrL[0];
for(const i of arrL.keys()){
if(maxL<arrL[i]){
maxL = arrL[i];
}
}
console.log(maxL);
const index = arrL.indexOf(maxL);
const Most = arrN[index];
console.log("出现次数最多的值是:"+Most+";出现次数为:"+maxL);
}
findMost([1,2,3,4,5,2,2,34,4,5,322,3,4,54,34]);
然后面试官说我没考虑时间复杂度(其实我是不懂时间复杂度这个东西),然后他提示我和哈希表啥的思路,但是我还是不会,然后刚刚看了一下博客,发现了一个貌似感觉应该更简单的方法,不知道是不是面试官说的那种(其实我是真的菜鸟)
//hash啊 说个思路,定义一个对象obj,遍历数组, 对象的键为数组的元素,值为出现的次数。然后遍历这个对象,找出值为最大的那个。
function findMost(arr) {
if (!arr.length) return
if (arr.length === 1) return 1
var res = {}
// 遍历数组
for (var i=0,l=arr.length;i<l;i++) {
if (!res[arr[i]]) {
res[arr[i]] = 1
} else {
res[arr[i]]++
}
}
// 遍历 res
var keys = Object.keys(res)
var maxNum = 0, maxEle
for (var i=0,l = keys.length;i<l;i++) {
if (res[keys[i]] > maxNum) {
maxNum = res[keys[i]]
maxEle = keys[i]
}
}
return maxNum
}
后面延伸问了一个判断两个对象是否相同,嗯,我不会,我当时只是跟他讲了一下思路,我好好理理。