作业求助:实现可参数化的连续重复字符检测方法noMultiples()
解决字符串连续重复字符检测的索引越界与泛化问题
看起来你在实现字符串连续重复检测时遇到了几个典型问题:索引越界、方法参数不匹配,还有没有正确泛化到任意重复次数。我帮你梳理下问题点,然后给出修正后的代码。
先说说你原代码里的核心问题
- 索引越界:你的循环条件是
i < s.length(),当i走到字符串最后几位时,i+1、i+2会超出字符串的索引范围(字符串索引从0开始,最大索引是length()-1),这直接导致了越界错误。 - 方法参数与调用不匹配:你定义的方法是
noMultiples(int n, String s),但main里却直接调用noMultiples("Hello World"),既缺参数又顺序不对,需要重载一个默认检测3个连续的方法。 - 逻辑与方法命名不符:方法名
noMultiples的意思应该是「不存在n个或以上连续相同字符」,但你原代码里找到3个连续就返回true,这和预期输出完全相反——比如"faaantastic"有3个连续的a,应该返回false才对。 - 没有泛化到任意n:你硬编码了比较3个字符的逻辑,没法适配参数
n的变化。
修正后的完整代码
public class StringChecker { // 重载方法:默认检测3个连续相同字符 public static boolean noMultiples(String s) { return noMultiples(3, s); } // 泛化方法:支持指定任意连续重复数量n public static boolean noMultiples(int n, String s) { // 先处理边界情况:n无效、字符串为空或长度不足n,直接返回true(不可能存在连续n个) if (n <= 1 || s == null || s.length() < n) { return true; } int currentConsecutiveCount = 1; // 从第二个字符开始,和前一个字符比较 for (int i = 1; i < s.length(); i++) { if (s.charAt(i) == s.charAt(i - 1)) { currentConsecutiveCount++; // 一旦连续数量达到n,说明存在重复,返回false if (currentConsecutiveCount >= n) { return false; } } else { // 字符不同,重置计数 currentConsecutiveCount = 1; } } // 遍历完没找到符合条件的连续字符,返回true return true; } public static void main(String[] args) { boolean result = noMultiples("Hello World"); System.out.println(result); // => true(没有3个连续相同字符) System.out.println(noMultiples("faaantastic")); // => false(存在3个连续的a) System.out.println(noMultiples(2, "Hello World")); // => false(存在2个连续的l) } }
关键细节解释
- 参数重载:添加了
noMultiples(String s),默认调用noMultiples(3, s),完美匹配你main里的调用方式。 - 边界处理:提前过滤掉n<=1(没意义)、字符串过短的情况,避免无效遍历。
- 安全的索引访问:通过比较当前字符和前一个字符(
i和i-1),永远不会出现索引越界的问题,因为i从1开始,最大到length()-1,i-1最小是0,完全在合法范围内。 - 动态计数逻辑:用
currentConsecutiveCount记录连续相同字符的数量,不管n是2、3还是更大的数,都能正确检测,实现了泛化需求。
内容的提问来源于stack exchange,提问作者Dalaro
相关产品推荐
相关产品推荐

