Map中的merge方法
数组中出现次数超过一半的数字
https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163
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。
查看20道真题和解析