You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化判断四整数至少三个相同的atLeastThreeMatch方法?

简洁实现atLeastThreeMatch的几种思路

你之前靠罗列所有满足条件的情况实现,确实会显得冗余,这里提供几种更简洁的实现思路,兼顾可读性和代码简洁度:

1. 直接判断所有「三个数相同」的组合

这种方式最直观,代码短小且逻辑清晰:

public static boolean atLeastThreeMatch(int a, int b, int c, int d) {
    // 覆盖所有三个数相同的场景,四个数全相同的情况会被任意一个条件命中
    return (a == b && a == c) || 
           (a == b && a == d) || 
           (a == c && a == d) || 
           (b == c && b == d);
}

这里的逻辑很简单:只要存在任意一组三个数相等,就返回true。四个数全部相等的情况自然会被这些条件覆盖(比如a==b==c==d会满足第一个条件a==b && a==c),不需要额外单独判断。

2. 统计数字出现频率

如果以后需要扩展到更多参数(比如5个、6个整数),这种方式的扩展性会更好:

import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.Map;
import java.util.function.Function;

public static boolean atLeastThreeMatch(int a, int b, int c, int d) {
    // 用流式API统计每个数字的出现次数
    Map<Integer, Long> countMap = Stream.of(a, b, c, d)
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    // 检查是否有数字出现次数≥3
    return countMap.values().stream().anyMatch(count -> count >= 3);
}

这种方式通过流式API统计每个数字的出现频次,只要有一个数字的出现次数达到3次或以上,就返回true。优点是逻辑通用,哪怕参数数量变化,只需要修改Stream的数据源即可。

3. 通过最大值/最小值判断

利用「如果有三个数字相同,那么这三个数字要么是四个数中的最大值,要么是最小值」的逻辑:

public static boolean atLeastThreeMatch(int a, int b, int c, int d) {
    int max = Math.max(Math.max(a, b), Math.max(c, d));
    int min = Math.min(Math.min(a, b), Math.min(c, d));
    
    // 统计最大值出现的次数
    int maxCount = (a == max ? 1 : 0) + (b == max ? 1 : 0) + 
                   (c == max ? 1 : 0) + (d == max ? 1 : 0);
    // 统计最小值出现的次数
    int minCount = (a == min ? 1 : 0) + (b == min ? 1 : 0) + 
                   (c == min ? 1 : 0) + (d == min ? 1 : 0);
    
    return maxCount >= 3 || minCount >= 3;
}

这个思路的核心是:如果三个数字相同,那么这三个数要么比第四个数大(成为最大值),要么比第四个数小(成为最小值),要么四个数全部相同(此时最大值和最小值相等,次数都是4)。所以只要最大值或最小值的出现次数≥3,就满足条件。


内容的提问来源于stack exchange,提问作者Isaac.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:37:45