idea调试代码

924 阅读2分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 十 天,点击查看活动详情

力扣调试代码

麻了,调试力扣代码,找错误,代码感觉思路没问题,但一直说运行超时,看题解也找不出问题,力扣debug需要会员,就试着用本地的idea调试,

最后发现

int len = queue.size();这里一开始写的是dq.size(); 这里确实代码超时应该是陷入死循环,那么应该就是陷入while/for循环中,陷入while循环那么就应该是队列queue一直有值,而我们的代码中删除节点的只有for循环中的poll函数,那么就有可能是并没有执行for循环,那么就有可能是len为0,这样就无法执行到for循环。 TreeNode headNode = queue.poll();

image.png

image.png

debug过程

image.png

这里设置主函数为static方便调试, zigzagLevelOrder也设置成static的,直接就可以调用静态方法,因为static静态类中无法使用this调用,不需要创建函数对象。this指的是调用此函数的对象。 static不会改变类中成员的访问权限。不允许用来修饰局部变量。局部变量具有生命周期用完就会被回收,比如其方法在栈中调用进栈出栈,出栈后其局部变量就会被销毁回收,无法在调用其静态变量。

静态成员变量是存放在方法区静态区中,且生命周期特别长,如果不是共享数据尽量不要静态化,非静态变量会随着类的创建而创建,类的消失而消失。

涉及到的代码如下

public class Test {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        TreeNode root = new TreeNode(3);
        TreeNode root9 = new TreeNode(9);
        TreeNode root20 = new TreeNode(20);
        TreeNode root15 = new TreeNode(15);
        TreeNode root7 = new TreeNode(7);
        root.left = root9;
        root.right = root20;
        root20.left = root15;
        root20.right = root7;
        List<List<Integer>> ans =zigzagLevelOrder(root);
        System.out.println(ans);
    }

    public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> ans = new LinkedList<List<Integer>>();
        if(root == null)return ans;
        boolean isLeft = true;
        Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
        queue.offer(root);
        while(!queue.isEmpty()){
            Deque<Integer> dq = new LinkedList<Integer>();
            int len = queue.size();
            for(int i=0;i<len;i++){
                TreeNode headNode = queue.poll();
                if(isLeft){
                    dq.offerLast(headNode.val);
                }
                else dq.offerFirst(headNode.val);
                if(headNode.left!=null){
                    queue.offer(headNode.left);
                }
                if(headNode.right!=null){
                    queue.offer(headNode.right);
                }

            }

            ans.add(new LinkedList<Integer>(dq));
            isLeft = !isLeft;
        }
        return ans;

    }
}