Java中创建List<List<Integer>>时输出不符合预期的问题排查
排查与修正largeGroupPositions方法的问题
我来帮你排查这个问题哈,你的代码有几个关键的小问题导致输出不符合预期,咱们一步步拆解:
原代码的核心问题
- 重复复用同一个
List<Integer>对象:你只在开头初始化了一次l1,每次往l2里添加的都是这个l1的引用。后续修改l1的内容时,之前已经加到l2里的元素也会跟着被修改,最终所有结果都会变成最后一次修改的状态。 - 循环结束后未处理最后一组连续字符:如果字符串的末尾是一组符合条件的大组(连续≥3个相同字符),循环结束后不会进入
else分支,这组数据就会被遗漏。
修正后的代码
class Solution { public List<List<Integer>> largeGroupPositions(String S) { List<List<Integer>> result = new ArrayList<>(); int n = S.length(); // 提前处理边界情况:字符串长度不足3,直接返回空列表 if (n < 3) { return result; } int count = 1; int startIndex = 0; for (int i = 1; i < n; i++) { if (S.charAt(i) == S.charAt(i - 1)) { count++; } else { // 检查当前组是否符合大组条件 if (count >= 3) { // 每次创建新的列表对象,避免引用复用问题 result.add(Arrays.asList(startIndex, i - 1)); } // 重置计数与起始位置 count = 1; startIndex = i; } } // 处理循环结束后,最后一组未检查的连续字符 if (count >= 3) { result.add(Arrays.asList(startIndex, n - 1)); } return result; } }
关键修改说明
- 避免List对象复用:每次需要添加结果时,直接创建新的列表(用
Arrays.asList()或者new ArrayList<>()),确保每个结果项都是独立的对象,不会互相干扰。 - 补充末尾组检查:循环结束后额外判断一次最后一组的长度,避免遗漏末尾的大组。
- 优化变量可读性:把
l1、l2改成语义更清晰的result、startIndex,降低代码理解成本。 - 提前处理边界场景:如果字符串长度小于3,直接返回空列表,减少不必要的循环执行。
内容的提问来源于stack exchange,提问作者rishabh_95
相关产品推荐
相关产品推荐

