Java找出数组中出现一半以上的数字


题目描述

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


输入[1,2,3,2,2,2,5,4,2]
返回值2

以下是本篇文章正文内容,下面案例可供参考

解题思路

采用HashMap:

  1. 将数组中的每一个array[i] 放进map中,key-value分别代表数字(int key = array[i])和它出现的次数(map.get(key));
  2. 如果map中已经存在key,则给value值+1;
  3. 最后判断value值是否大于数组长度的一半,满足条件,则输出对应的key值。

代码如下

import java.util.*;
public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        HashMap<Integer,Integer> map = new HashMap<>();
        int len = array.length;
        if(len == 0) return 0;
        if(len == 1) return array[0];
        for(int i =0;i<len;i++){
            int key = array[i];
            //map中已经有array[i]这个值
            if(map.containsKey(key)){
                if(map.get(key)+1>len/2){//map.get(key)得到的是value值
                    //+1:判断加上本次的次数是否大于len/2,防止最后一个数是想要输出的数而无法计入+1
                    return key;
                }else{
                    map.replace(key,map.get(key)+1);//如果map中存在,将对应的value值+1
                    //replace()方法:替换 hashMap中指定的key对应的value
                }
            }else{
                //map中没有array[i]这个值
                map.put(key,1);//给value初始值为1
            }
        }
        //代码走到这,表示没有以上情况发生,返回0
        return 0;
    }
}

不建议使用:

import java.util.*;
public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        Arrays.sort(array);
        if(array.length == 1) {
            return array[0];
        }
        int len = array.length;
        for(int i = 0;i <= len/2;i++) {
            for(int j = i+len/2;j < len;j++) {
                if(array[i] == array[j]) {
                    return array[i];
                }
            }
        }
        return 0;
    }
}

总结

replace()方法:
替换 hashMap中指定的key对应的value

hashmap.replace(K key, V oldValue, V newValue)

oldValue,表示key对应的旧value,newValue表示想要更换成的新的value

本文写法为:map.replace(key,map.get(key)+1);

hashmap.replace(key,newValue);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值