import java.util.*; public class Solution { public int MoreThanHalfNum_Solution (int[] numbers) { // write code here Map<Integer, Integer> valueMap = new HashMap<>(); for (int i = 0; i < numbers.length; i++) { int num = numbers[i]; valueMap.merge(num, 1, Integer::sum); if (valueMap.get(num) > numbers.length / 2) return num; } return 0; } }
在Java 8及以上版本中,HashMap
类提供了一个名为 merge
的方法,它是一个非常方便的功能,用于更新映射的值。merge
方法通常用于以下场景:
- 当键不存在时,初始化它。
- 当键存在时,根据提供的函数更新它的值。
merge
方法的签名如下:
V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
参数说明:
key
:要更新的键。value
:要与现有值结合的新值(如果存在)。remappingFunction
:一个函数,用于定义如何结合新值和现有值。如果键不存在,此函数将只接收到新值。
返回值:
- 映射之后与键关联的值。
可以直接写成
valueMap.merge(num, 1, (oldValue, newValue) -> oldValue - newValue);
使用 merge
方法,你可以将之前提到的代码片段优化为:
valueMap.merge(num, 1, Integer::sum);
这行代码的意思是:对于键 num
,使用值 1
与当前值(如果存在)进行合并,合并的方式是使用 Integer::sum
函数,即简单地将两个整数值相加。如果 num
之前不存在于 valueMap
中,它将被添加进去,并将值设置为 1
。如果 num
已经存在,1
将被加到现有的值上。
在你的原始问题上下文中,使用 merge
方法可以使代码更加简洁:
public int MoreThanHalfNum_Solution(int[] numbers) { Map<Integer, Integer> valueMap = new HashMap<>(); for (int num : numbers) { valueMap.merge(num, 1, Integer::sum); if (valueMap.get(num) > numbers.length / 2) { return num; } } return 0; }
这段代码将为数组中的每个数字更新 valueMap
中的计数,并在找到超过一半的数值时立即返回它。如果遍历完整个数组都没有找到这样的数值,则返回 0
。