V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
diangdiang
V2EX  ›  程序员

大家在 OJ 上做题的时候,有没有碰到过这样的情况?求各位大大指点,挺急的

  •  
  •   diangdiang · 2017-02-24 20:32:37 +08:00 · 2298 次点击
    这是一个创建于 2864 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这几天碰到两次线上有 case 通不过,但是相同的 case 在本地上却能给出正确的结果,本地和线上的代码一样。 比如这道题 https://leetcode.com/problems/spiral-matrix/?tab=Description

    代码有点丑如下:

    import java.util.*;
    public class Solution {
        public static List<Integer> spiralOrder(int[][] matrix) {
            if (matrix == null || matrix.length == 0)
                return new LinkedList<Integer>();
    
            int m = matrix.length;
            int n = matrix[0].length;
    
            int left = 0;
            int right = n-1;
            int top = 0;
            int bottom = m-1;
            List<Integer> spiral = new LinkedList<>();
            int k = 0;
            while (k < m*n) {
                int i = top;
                int j = left;
                for (; j <= right; j++) {
                    spiral.add(matrix[i][j]);
                    k++;
                }
                i++; j--;
                for (; i <= bottom; i++) {
                    spiral.add(matrix[i][j]);
                    k++;
                }
    
                i--; j--;
                for (; j >= left; j--) {
                    spiral.add(matrix[i][j]);
                    k++;
                }
    
                i--; j++;
    
                for (; i > top; i--) {
                    spiral.add(matrix[i][j]);
                    k++;
                }
    
                top++;
                left++;
                bottom--;
                right--;
            }
            return spiral;
    
        }
    
        public static void main(String[] args) {
            int[][] mat = {
                {2},
                {3}
            };
    
            List<Integer> spiral = spiralOrder(mat);
            for (Integer num: spiral)
                System.out.printf("%d ", num);
            System.out.println();
    
        }
    }
    
    
    [[2,3]] 这个 case 本地得到是[2,3]。
    
    
    leetcode 给的结果是
    
    Input: [[2,3]]
    
    Output:[2,3,2]
    
    Expected:[2,3]
    
    11 条回复    2017-02-26 08:08:31 +08:00
    diangdiang
        1
    diangdiang  
    OP
       2017-02-24 20:34:19 +08:00
    消灭零回复
    diangdiang
        2
    diangdiang  
    OP
       2017-02-24 20:35:25 +08:00
    求各路大神指点,困惑很久了
    diangdiang
        3
    diangdiang  
    OP
       2017-02-24 20:38:24 +08:00
    要不大家本地测试下,代码可以直接跑,谢谢各位大大
    linbiaye
        4
    linbiaye  
       2017-02-24 20:39:34 +08:00
    你这有啥奇怪的,一两个 case 正确能保证所有 case 都正确?
    111qqz
        5
    111qqz  
       2017-02-24 21:03:36 +08:00
    打 cf 遇到过类似的...原因大概是一些函数忘记返回值或者某些变量忘记初始化之类的...
    casparchen
        6
    casparchen  
       2017-02-24 21:06:00 +08:00
    你的代码有问题。另外 [2,3] 不是 {{2},{3}} 而是 {{2,3}}.
    你的代码转第四次的时候回到了 2 ,所以最后多了个 2
    hxndg
        7
    hxndg  
       2017-02-24 21:14:02 +08:00
    额。。。还有一种情况就是解法是一次性的,改变了测试样例(比方说二叉树)的结构,那么也会出现这种问题,不过有的 oj 会报 runtime error 然后就什么都没有了
    @111qqz
    diangdiang
        8
    diangdiang  
    OP
       2017-02-24 21:22:27 +08:00
    @casparchen 多谢,我的锅
    virusdefender
        9
    virusdefender  
       2017-02-24 22:43:36 +08:00 via iPhone
    这再正常不过了, oj 比你的 case 更全
    111qqz
        10
    111qqz  
       2017-02-24 22:48:48 +08:00 via Android
    @hxndg 嗯, leetcode 貌似这样是会 RE 的
    jedihy
        11
    jedihy  
       2017-02-26 08:08:31 +08:00
    这种写法最后返回结果要返回结果里面的前 0 到 n-1 个,不然会多几个,因为你的 while loop 是做完四次再判断。最后一次 loop ,多算一行或者一列。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1418 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:27 · PVG 01:27 · LAX 09:27 · JFK 12:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.