如何用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个组。
修改方案
换一种逻辑:遍历字符串时,只在刚进入新重复组时计数,避免重复统计。具体步骤:
- 保留你用Scanner去除空格的逻辑(这部分是对的)
- 处理特殊情况:如果字符串长度小于2,直接返回0(没有重复的可能)
- 用一个标记变量记录当前是否处于重复组内,防止同一组多次计数
- 从第二个字符开始遍历,对比当前字符和前一个字符:
- 若字符相同且不在重复组内,说明是新组的开始,计数+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
相关产品推荐
相关产品推荐

