求最长相同元素连续序列算法:Java代码存在问题求助
问题排查与修正
原代码存在的问题
- 初始计数逻辑错误:
currentSequence初始为0,且第一个元素仅赋值prev就跳过,导致第一个连续序列的计数少1。比如第一个测试用例中4连续出现4次,原代码计算出的currentSequence是3,而非正确的4。 - 遗漏最后一个序列的检查:循环结束后,最后一段连续序列不会进入
else分支进行最长序列比较,若最长序列在输入末尾,会被忽略。 - 初始值未正确初始化:
numOfLongestSequence初始为0,若输入中没有0且所有序列长度为1时,结果会错误显示0;longestSequence初始为1,但未绑定初始元素。
修正后的代码
import java.util.Scanner; public class Main { public static void main(String[] args) { System.out.println("Search for longest sequence: "); Scanner s = new Scanner(System.in); // 处理空输入或直接输入0的边界情况 if (!s.hasNextInt()) { System.out.println("No input provided."); s.close(); return; } int value = s.nextInt(); if (value == 0) { System.out.println("No valid elements."); s.close(); return; } int prev = value; int numOfLongestSequence = prev; int longestSequence = 1; int currentSequence = 1; while (s.hasNextInt() && (value = s.nextInt()) != 0) { if (value == prev) { currentSequence++; } else { // 比较当前序列与最长序列 if (currentSequence > longestSequence) { longestSequence = currentSequence; numOfLongestSequence = prev; } // 重置当前序列计数 currentSequence = 1; } prev = value; } // 循环结束后,检查最后一段序列 if (currentSequence > longestSequence) { longestSequence = currentSequence; numOfLongestSequence = prev; } System.out.println("Longest sequence: " + longestSequence + " times " + numOfLongestSequence); s.close(); } }
修正说明
- 提前处理初始输入:先读取第一个元素,判断输入是否为空或直接输入0的边界情况,避免后续逻辑出错。
- 初始化计数与结果变量:用第一个有效元素初始化
prev、numOfLongestSequence,currentSequence和longestSequence初始为1,符合第一个元素的计数逻辑。 - 添加循环结束后的检查:确保最后一段连续序列也参与最长序列的比较,解决末尾序列被遗漏的问题。
- 关闭Scanner资源:避免资源泄漏。
测试用例验证
- 测试用例1:
4 4 4 4 3 3 3 4 6 6 6 0
输出:Longest sequence: 4 times 4 - 测试用例2:
4 4 4 3 3 3 3 3 4 6 6 6 0
输出:Longest sequence: 5 times 3 - 测试用例3:
4 4 333 333 4 3 -66 -66 -66 0
输出:Longest sequence: 3 times -66
内容的提问来源于stack exchange,提问作者Karolina Woźniak
相关产品推荐
相关产品推荐

