问题描述:
春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。
给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。
若没有金额超过总数的一半,返回0。
测试样例:
[1,2,3,2,2],5
返回:2
分析:
一共需要遍历两次数组。
第一次遍历,将数组的值放入map(key为数组中的数字,value为出现的次数)中,如果有相同的,就直接将对应的value值加一,如果没有就将它放进map中。
第二次遍历,是为了找value值大于数组的一半长度的key值。
import java.util.*;
public class Gift {
public static void main(String[] args) {
int [] gifts = {1,2,2,3,2};
System.out.println(getValue(gifts,5));
}
public static int getValue(int[] gifts, int n) {
Map<Integer,Integer> map = new TreeMap<>();
for(int i = 0;i<n;i++){
if(map.containsKey(gifts[i])){
map.put(gifts[i],map.get(gifts[i])+1);
}else{
map.put(gifts[i],1);
}
}
for(int i = 0;i<n;i++){
if(map.get(gifts[i]) > n/2){
return gifts[i];
}
}
return 0;
}
}