Kattis Texture Analysis问题调试求助:自定义用例全过但最后用例失败
Kattis Texture Analysis问题调试求助
我在调试Kattis平台的Texture Analysis问题时遇到了麻烦:自己想的测试用例都能通过,但最后一个测试用例始终失败,求问可能的原因?
问题:Kattis平台Texture Analysis
我的Java代码如下:
public static void main(String[] args) throws Exception { BufferedReader sc = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter dc = new BufferedWriter(new OutputStreamWriter(System.out)); int numOfLines = 1; for (;;) { String inputLine = sc.readLine(); if (inputLine.equals("END")) break; else if (!inputLine.contains(".")) { dc.write(numOfLines++ + " EVEN\n"); } else { // 以下两行将单行字符转为数组 String[] tempArray = inputLine.split(""); ArrayList<String> charArray = new ArrayList<String>(Arrays.asList(tempArray)); // 以下代码块找出所有星号的位置并存入allIndexes数组 // 若纹理均匀,位置例如0,2,4,6;若不均匀,位置例如0,1,5,8 String str = "*"; List<Integer> allIndexes = IntStream.range(0, charArray.size()).boxed() .filter(j -> charArray.get(j).equals(str)) .collect(Collectors.toList()); ArrayList<Integer> duplicateList = new ArrayList<>(); // 该循环用于标准化数值 // 均匀数组0,2,4,6会转为2,2,2,2;不均匀数组0,2,6,8会转为2,4,2,2 // 这样可轻松发现异常值 for (int j = 0; j < allIndexes.size(); j++) { if(j < allIndexes.size() - 1) duplicateList.add(allIndexes.get(j + 1) - allIndexes.get(j)); } Boolean isArrayUneven = false; // 检查数组中是否存在异常值,若存在则标记为不均匀 for (int i = 1; i < duplicateList.size();i++) { if (duplicateList.get(0) != duplicateList.get(i)) { isArrayUneven = true; } } if (isArrayUneven ==true ) { dc.write(numOfLines++ + " NOT EVEN" + "\n"); } else{ dc.write(numOfLines++ + " EVEN" + "\n"); } } } dc.close(); sc.close(); }
核心问题:代码逻辑完全不符合题目定义的「均匀纹理」规则
题目要求的均匀纹理是每个星号到它最近的星号(或边缘)的距离都相等,但你的代码只检查了星号之间的间距是否一致,完全忽略了星号与边缘的距离,同时还有几个边界场景处理错误:
- 单个星号的场景:比如输入
.*..(长度4,星号在位置1),你的代码中duplicateList为空,会直接输出EVEN,但实际上这个星号到左边缘距离是1,到右边缘距离是2,最近距离不相等,应该输出NOT EVEN。 - 星号间距一致但边缘距离不符:比如输入
.*..*(长度5,星号在1和4),星号间距是3,你的代码会判定为EVEN,但第一个星号到左边缘的距离是1(最近距离),到右侧星号的距离是3;最后一个星号到右边缘的距离是1(最近距离),到左侧星号的距离是3,这些最近距离不相等,实际应该是NOT EVEN。 - 全星号场景:比如输入
**(长度2),你的代码因为不含.直接输出EVEN,但每个星号到相邻星号的距离是1,到边缘的距离是0,最近距离不相等,实际应该是NOT EVEN。
修正思路
- 先收集所有星号的索引位置到列表
stars中:- 如果
stars为空,直接输出EVEN(题目规定无星号时纹理均匀)。
- 如果
- 计算基准距离
d:第一个星号到左边缘的距离(即stars.get(0))。 - 检查最后一个星号到右边缘的距离是否等于
d(右边缘距离 =inputLine.length() - 1 - stars.get(stars.size()-1))。 - 遍历每对相邻星号,检查它们的间距是否等于
2*d(因为每个星号到中间的距离是d,总间距应为2*d,这样两个星号的最近距离都是d)。 - 以上所有检查通过则输出
EVEN,否则输出NOT EVEN。
修正后的示例代码片段
// 替换原有的else块逻辑 List<Integer> stars = IntStream.range(0, inputLine.length()) .filter(i -> inputLine.charAt(i) == '*') .boxed() .collect(Collectors.toList()); boolean isEven = true; if (stars.isEmpty()) { isEven = true; } else { int d = stars.get(0); // 检查最后一个星号到右边缘的距离 int lastEdgeDist = inputLine.length() - 1 - stars.get(stars.size() - 1); if (lastEdgeDist != d) { isEven = false; } else { // 检查相邻星号间距是否为2*d for (int i = 0; i < stars.size() - 1; i++) { int gap = stars.get(i+1) - stars.get(i); if (gap != 2 * d) { isEven = false; break; } } } } dc.write(numOfLines++ + (isEven ? " EVEN" : " NOT EVEN") + "\n");
内容的提问来源于stack exchange,提问作者Thiazzi
相关产品推荐
相关产品推荐

