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

如何用Java及两层嵌套for循环计算扑克牌中的对子数量

问题分析与解决方案

首先得说,你现在的代码逻辑有几个关键问题,导致它没法正确统计对子数量:

1. 搞混了花色和点数的位置

每张牌的格式是[花色][点数](比如sT里s是黑桃花色,T是10点),所以点数在字符串的奇数索引位置(从0开始数的话,第1、3、5...位),但你的代码里遍历的是偶数索引(i从0开始,步长2),这等于一直在比较花色,完全没碰点数——这肯定找不到对子啊!

2. 循环逻辑完全混乱

你的嵌套循环既没有遍历所有两两组合的牌,比较的位置也不对:比如hand.charAt(i) == hand.charAt(i+2)是在拿第i位的字符和i+2位的字符比,也就是隔了一张牌的花色,这和点数半毛钱关系都没有;j的起始和步长也不对,导致很多牌都没被检查到。

3. 计数逻辑错误

就算碰巧找到相同的字符,你的count++方式也会重复计数或者漏数,没法准确统计真正的对子数量。


正确的实现思路

要统计对子数量,我们可以分三步来做:

  1. 提取所有牌的点数:遍历字符串,只拿每个牌的点数(奇数索引位置的字符);
  2. 统计每个点数的出现次数:用一个哈希表记录每个点数出现了几次;
  3. 计算总对子数:对于每个点数的出现次数n,它能形成的对子数是组合数n*(n-1)/2(比如出现3次就能形成3个对子,出现2次形成1个),把所有点数的这个值加起来就是总对子数。

修正后的代码示例

public int countPairs(String hand) {
    // 提取所有牌的点数
    List<Character> ranks = new ArrayList<>();
    for (int i = 1; i < hand.length(); i += 2) {
        ranks.add(hand.charAt(i));
    }
    
    // 统计每个点数的出现次数
    Map<Character, Integer> rankCount = new HashMap<>();
    for (char rank : ranks) {
        rankCount.put(rank, rankCount.getOrDefault(rank, 0) + 1);
    }
    
    // 计算总对子数
    int totalPairs = 0;
    for (int count : rankCount.values()) {
        totalPairs += count * (count - 1) / 2;
    }
    
    return totalPairs;
}

代码说明

  • 第一步循环:从索引1开始,每次步长2,精准拿到每张牌的点数;
  • 哈希表统计:用getOrDefault可以轻松处理第一次出现的点数,不用额外判断;
  • 组合数计算:n*(n-1)/2是数学上的组合公式,能准确算出一个点数能形成的所有两两组合(也就是对子数),完全符合你要的规则:
    • 输入sTh3c9hQ(点数全不重复)→ 输出0;
    • 输入sTh3c9sT(点数T出现2次)→ 输出1;
    • 若有一个点数出现3次→输出3;
    • 若有两个不同点数各出现2次→输出2。

内容的提问来源于stack exchange,提问作者Kailee Brody

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:38:08