有序数组中出现次数超过25%的元素

121 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

题目描述

给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。 请你找到并返回这个整数 来源:力扣(LeetCode)

  • 示例1
输入: arr = [1,2,2,6,6,6,6,7,10]
输出: 6
  • 示例2
输入: arr = [2,3,4,6,7,7,7,7,8]
输出: 7

提示:

  • 1 <= arr.length <= 10^4
  • 0 <= arr[i] <= 10^5

思路分析

据题意可知,给出一个递增的有序整数数组,还知道数组里面刚好有一个整数,这个整数它在数组出现的次数超过了数组元素总个数的25%,要求我们找出这个元素。首先呢,给出的是一个数组,少不了要循环它,发现要我们求的结果跟次数有关,那就需要先求出每个元素出现的次数;将每个元素出现的次数跟数组的总长度除以4作比较,哪个比较大就是它了,数组总长度除以4可能会出现浮点数;或者我们元素出现的次数乘以4再和数组长度作比较,这样也可以;具体做法:
声明一个空对象,判断对象中是否有以元素作为键的键值对,如果没有,就给它加一个,元素作为对象的键,元素出现的次数作为属性值也就是一,若是判断对象中有以元素作为键的键值对,就给它的次数加一;这样的话,数组元素出现的次数就都计算出来了;最后循环这个对象,取每个元素的次数乘以4再和数组的长度做比较,大于的就是我们的目的元素了。

AC代码

let arr = [1,2,3,4,4,4,4,5,6,4];
function solution(arr) {
    let obj = {};
    for(let i=0; i<arr.length-1; i++) {
        if(obj[arr[i]]) {
            obj[arr[i]] = obj[arr[i]] + 1;
        }else{
            obj[arr[i]] = 1;
        }
    }
    for(let key in obj) {
        if(obj[key]*4 > arr.length) {
            console.log(key)
        }
    }
}
solution(arr);

总结