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

如何用Scanner统计相邻重复项?代码输出异常求助

相邻重复项组计数问题排查

我需要实现static int adjacentDuplicatesCount(String str)方法,该方法返回相邻重复项组的数量。给定输入字符串"1 1 2 7 7 7 7 3 3 5 3",预期返回值为3(对应"11"、"7777"、"33"三个重复组),但我用Scanner编写的代码返回了4,与预期不符。我是编程初学者,不清楚问题所在,也不理解他人提出的修改建议,希望得到帮助。

我的代码如下:

public static int adjacentDuplicatesCount(String str) {
    Scanner reader = new Scanner(str);
    String result = "";
    int count = 0;

    while(reader.hasNext()){
        result+= reader.next();
    }

    for (int i = 1; i < result.length() -1; i++) {
        if (result.charAt(i) == result.charAt(i + 1)) {
            count++;
        }
    }
    return count;
}
  • 预期输出:3 == 3
  • 实际输出:4 == 3

问题分析

你的代码逻辑错在统计了相邻重复的次数,而非重复组的数量:
输入经Scanner处理后得到字符串"11277773353",原代码的循环会把每个相邻重复的位置都算一次——比如"7777"里有3次相邻重复,会让count加3;"11"和"33"各加1次,最终得到4。但我们需要的是:不管一个组里有多少个重复字符,连续的相同字符只算1个组。

修改方案

换一种逻辑:遍历字符串时,只在刚进入新重复组时计数,避免重复统计。具体步骤:

  1. 保留你用Scanner去除空格的逻辑(这部分是对的)
  2. 处理特殊情况:如果字符串长度小于2,直接返回0(没有重复的可能)
  3. 用一个标记变量记录当前是否处于重复组内,防止同一组多次计数
  4. 从第二个字符开始遍历,对比当前字符和前一个字符:
    • 若字符相同且不在重复组内,说明是新组的开始,计数+1并标记进入组
    • 若字符不同,标记离开重复组

修改后的代码:

import java.util.Scanner;

public class Main {
    public static int adjacentDuplicatesCount(String str) {
        Scanner reader = new Scanner(str);
        String result = "";
        while (reader.hasNext()) {
            result += reader.next();
        }

        if (result.length() < 2) {
            return 0;
        }

        int count = 0;
        boolean inDuplicateGroup = false;

        for (int i = 1; i < result.length(); i++) {
            if (result.charAt(i) == result.charAt(i - 1)) {
                if (!inDuplicateGroup) {
                    count++;
                    inDuplicateGroup = true;
                }
            } else {
                inDuplicateGroup = false;
            }
        }
        return count;
    }

    public static void main(String[] args) {
        System.out.println(adjacentDuplicatesCount("1 1 2 7 7 7 7 3 3 5 3")); // 输出3,符合预期
    }
}

验证逻辑

对处理后的字符串"11277773353":

  • i=1:字符1与前一个1相同,未在组内→count=1,标记进入组
  • i=2:字符2与前一个1不同→重置标记
  • i=4:字符7与前一个7相同,未在组内→count=2,标记进入组
  • i=8:字符3与前一个3相同,未在组内→count=3,标记进入组
    其余位置要么字符不同,要么已在组内,不再计数,最终返回3,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:15:31