如何使用for循环实现指定索引对应坑的起止位置查找?
实现坑的起始与结束索引查找功能
需求说明
给定一个每行存储一个整数的文本文件,整数代表地面坑的深度(0为平地)。输入一个1-based索引:
- 若该索引处值为0,提示“该索引处没有坑!”
- 若该索引处是坑(值不为0),从该位置反向遍历到第一个0的位置,确定坑的起始索引;再正向遍历到第一个0的位置,确定坑的结束索引。
以示例数据为例:
0 0 0 1 2 2 2 2 2 2 3 2 2 1 0
输入索引10(对应深度3),最终应输出起始索引3、结束索引13。
修正后的完整实现代码
import java.util.List; import java.util.Scanner; public class PitFinder { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 假设data已从txt文件读取完成,存储每行字符串 List<String> data = List.of("0", "0", "0", "1", "2", "2", "2", "2", "2", "2", "3", "2", "2", "1", "0"); // 获取用户输入的1-based索引 int inputIndex = sc.nextInt(); int currentIdx = inputIndex - 1; // 转换为0-based索引 // 校验索引合法性 if (currentIdx < 0 || currentIdx >= data.size()) { System.out.println("输入的索引超出范围!"); return; } int depth = Integer.parseInt(data.get(currentIdx)); if (depth == 0) { System.out.println("该索引处没有坑!"); return; } // 反向遍历找坑的起始索引(1-based) int startIdx = currentIdx; while (startIdx > 0) { int prevDepth = Integer.parseInt(data.get(startIdx - 1)); if (prevDepth == 0) { break; } startIdx--; } int pitStart = startIdx + 1; // 正向遍历找坑的结束索引(1-based) int endIdx = currentIdx; while (endIdx < data.size() - 1) { int nextDepth = Integer.parseInt(data.get(endIdx + 1)); if (nextDepth == 0) { break; } endIdx++; } int pitEnd = endIdx + 1; System.out.printf("坑的起始索引:%d,结束索引:%d%n", pitStart, pitEnd); } }
关键逻辑说明
- 索引转换:用户输入的是1-based索引,需转换为代码中列表的0-based索引进行操作,最终输出时再转回1-based。
- 反向遍历找起始:从当前索引向左遍历,直到遇到前一个位置为0,此时当前位置就是坑的第一个非0位置,转1-based后即为起始索引。
- 正向遍历找结束:从当前索引向右遍历,直到遇到后一个位置为0,此时当前位置就是坑的最后一个非0位置,转1-based后即为结束索引。
- 边界处理:若坑位于列表首尾(无相邻0),遍历会自动停止在列表边界,避免越界。
原代码问题分析
- 遍历初始值错误:用
input(深度值)代替当前索引位置,逻辑完全错误。 - 循环条件错误:反向遍历使用
i < data.size(),不符合向左遍历的逻辑,应改为i >= 0。 - 未终止循环:找到第一个0后未停止遍历,会继续查找更前面的0,导致起始索引错误。
- 缺失正向遍历逻辑:未实现坑的结束索引查找功能。
内容的提问来源于stack exchange,提问作者Nicoden
相关产品推荐
相关产品推荐

