请求修正Java程序:将最长连续1序列查找功能改为最短连续1序列查找
修正查找最短连续1序列的Java代码
嘿,我来帮你把这段代码改对~你现在的代码逻辑确实是在找最长连续1,咱们一步步梳理问题,然后修正:
原代码的核心问题
ans初始设为字符串长度,然后用count < ans更新ans,这逻辑完全搞反了——你要找最短的,应该初始把ans设成一个很大的值,再用更小的连续1长度去更新它。- 遇到非1字符时直接重置
count,但没把之前统计的连续1长度纳入最短值的比较,而且会把0(非1的情况)错误地算进结果里。 - 循环结束后没处理最后一段连续1的情况,比如字符串以1结尾的话,这段长度会被遗漏。
修正后的完整代码
import java.util.Scanner; class Chotu { // Returns length of the shortest consecutive 1's sequence public static int ShortestSequence(String s) { int count = 0; // 初始设为最大整数,确保第一次遇到连续1时能更新 int ans = Integer.MAX_VALUE; // 标记是否存在至少一段连续1 boolean hasOnes = false; for(int i=0; i<s.length(); i++) { if (s.charAt(i) == '1') { count++; hasOnes = true; } else { // 遇到非1时,只有之前有统计过连续1,才更新最短长度 if (count > 0) { ans = Math.min(ans, count); count = 0; } } } // 处理最后一段是连续1的情况 if (count > 0) { ans = Math.min(ans, count); } // 没有连续1就返回-1,否则返回最短长度 return hasOnes ? ans : -1; } // Driver code public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); int result = ShortestSequence(s); System.out.println(result); sc.close(); } }
关键修改点说明
- 初始化调整:把
ans设为Integer.MAX_VALUE,这样第一次统计到连续1时,必然会把ans更新为这段的长度。 - 添加存在性标记:
hasOnes用来判断字符串里有没有1,没有的话直接返回-1,符合需求。 - 非1字符处理:遇到非1时,只有当之前有连续1的统计(
count>0),才去比较更新最短长度,避免把0混入结果。 - 收尾检查:循环结束后如果
count>0,说明最后一段是连续1,必须把这段长度也加入比较,防止遗漏。 - 主方法优化:只调用一次
ShortestSequence方法,避免重复计算;加上sc.close()规范关闭资源。
测试示例
输入:
11100011001
连续1的段分别是3、2、1,最短的是1,运行代码后输出1,完全符合你的期望。
内容的提问来源于stack exchange,提问作者Mahesh Divate
相关产品推荐
相关产品推荐

