Java数组配对计数问题:如何按每2个相同元素为1对统计数量
问题根因
现有双重循环逻辑的本质是统计所有两两相等元素的组合数,对应公式为C(n,2) = n*(n-1)/2,和需求中「每2个相同元素计为1对」的规则完全不匹配:比如4个相同元素会得到6次匹配,3个相同元素会得到3次匹配,和你观测到的计数偏差完全符合。
优化实现
推荐先统计每个面值的出现次数,再按规则计算配对数,优化后代码如下:
import java.util.HashMap; import java.util.Map; import java.util.Random; public class BonusGame { public static void main(String[] args) { Random r = new Random(); int[] bonusGame = new int[5]; int bonusGameSum = 0; // 随机数组生成逻辑保持原有概率不变 for (int newNum = 0; newNum < 5; newNum++) { int chanceGen = r.nextInt(100); if (chanceGen <= 50) { bonusGame[newNum] = 10; } else if (chanceGen <= 77) { bonusGame[newNum] = 20; } else if (chanceGen <= 92) { bonusGame[newNum] = 50; } else if (chanceGen <= 98) { bonusGame[newNum] = 200; } else { bonusGame[newNum] = 1000; } } // 打印生成的数值 for (int z : bonusGame) { System.out.println(z); } // 统计每个面值的出现次数 Map<Integer, Integer> valueCount = new HashMap<>(); for (int num : bonusGame) { valueCount.put(num, valueCount.getOrDefault(num, 0) + 1); } // 按规则计算奖金 for (Map.Entry<Integer, Integer> entry : valueCount.entrySet()) { int faceValue = entry.getKey(); int count = entry.getValue(); int pairs = count / 2; // 整数除法自动取整,完全匹配需求规则 if (pairs > 0) { int winAmount = pairs * faceValue; System.out.printf(" 你赢得 %d 欧元 \n", winAmount); bonusGameSum += winAmount; } } System.out.println("本次总奖金:" + bonusGameSum); } }
方案优势
- 逻辑准确:
count / 2的整数除法刚好匹配需求:3个相同得1对、4个相同得2对、6个相同得3对,不会出现多计数的问题 - 可维护性高:后续新增面值只需要调整随机生成部分的概率分支即可,统计逻辑无需修改
- 性能更优:仅需要两次单层遍历,时间复杂度从原有O(n²)降低为O(n),数组长度变大时优势更明显
内容的提问来源于stack exchange,提问作者Ruslan Pylypyyuk
相关产品推荐
相关产品推荐

