zoukankan      html  css  js  c++  java
  • 牛客题霸NC73数组中出现次数超过一半的数字Java题解

    牛客题霸NC73数组中出现次数超过一半的数字Java题解

    https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=117&&tqId=34995&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking

    方法1:摩尔投票法
    解题思路:假设数组首个元素为众数,遍历并统计票数,设众数的票数为1,非众数的票数为-1。当发生票数和为0时,令当前的数字为众数继续遍历数组,当遍历完数组后,最后一次被作为众数的那个数就是数组真正的众数。

    public class Solution {
        public int MoreThanHalfNum_Solution(int [] array) {
            int votes = 0;
            int count = 0;
     
            int res = 0;
     
            for(int num : array){   //遍历数组中的每个数字       
                if(votes == 0){     //当票数votes等于0,则将当前数字num作为众数
                    res = num;
                }
                votes+=(num==res?1:-1);   //如果当前数字num等于众数,则票数votes自增1,否则票数自减1
            }
     
            for(int num :array){   //统计众数出现的次数
                if(num == res){
                    count++;
                }
            }
     
            if(count>array.length/2){   //判断众数出现的次数是否操作数组长度的一半
                return res;
            }else{
                return 0;
            }
        }
    }

    方法2:HashMap
    解题思路:利用HashMap统计数组中每个数字出现的次数,出现次数超过数组一半的那个数就是数组的众数。

    import java.util.*;
    public class Solution {
        public int MoreThanHalfNum_Solution(int [] array) {
            HashMap<Integer,Integer> map = new HashMap<>();
     
            for(int a : array){         //遍历数组array
                if(!map.containsKey(a)){  //如果map中不包含值为a的key,那么将(a,1)添加到map中  
                    map.put(a,1);
                }else{                   //如果map中包含值为a的key,那么将key为a的val加1
                    int val = map.get(a);
                    val++;
                    map.put(a,val);
                }
            }
     
            for(int i:array){        //找出出现次数超过一半的数,返回
                if(map.get(i)>array.length/2){
                    return i;
                }
            }
            return 0;
        }
    }

    方法3:数组排序
    解题思路:将数组按从小到大的顺序排序,中间的那个数就是众数。

    import java.util.*;
    public class Solution {
        public int MoreThanHalfNum_Solution(int [] array) {
           Arrays.sort(array);      //将数组按从小到大的顺序排序
           int res = array[array.length/2];  //位于数组中间的那个数就是众数
     
           int count=0;
           for(int i :array){  //统计众数出现的次数
               if(res == i){
                   count++;
               }
           }
     
            if(count>array.length/2){  //如果众数出现的次数超过数组长度的一半,则返回
                return res;
            }
            return 0;
        }
    }
  • 相关阅读:
    c#2005中的各个控件转换为html代码
    支付宝接口参数详谈
    IE6兼容菜单
    cookie版购物车
    火狐执行子页面方法
    easyui中datebox文本框输入非数字报错的改善
    右侧悬浮菜单
    内边距、边框和外边距
    自我超越
    DateUtils 时间工具类
  • 原文地址:https://www.cnblogs.com/yunfeiyang2020/p/14045239.html
Copyright © 2011-2022 走看看