You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

修正思路

  1. 先收集所有星号的索引位置到列表stars中:
    • 如果stars为空,直接输出EVEN(题目规定无星号时纹理均匀)。
  2. 计算基准距离d:第一个星号到左边缘的距离(即stars.get(0))。
  3. 检查最后一个星号到右边缘的距离是否等于d(右边缘距离 = inputLine.length() - 1 - stars.get(stars.size()-1))。
  4. 遍历每对相邻星号,检查它们的间距是否等于2*d(因为每个星号到中间的距离是d,总间距应为2*d,这样两个星号的最近距离都是d)。
  5. 以上所有检查通过则输出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:30:44