学习与做题中的困惑

来源:5-2 测试你的链表程序

软件工程小白菜

2019-03-08

波波老师您好,听完5-2后,尝试做了您布置的练习,发现86题partition并没有想象中的简单。在经历了将近40分钟的思考,编写,分情况讨论,print调试,和Debug,终于得到了accepted并且运行速度也超过了其他程序的100%。

但是看了Solution给出的答案后,发现自己的答案过于冗长,而且也不是最佳的逻辑,感觉很有挫败感。

想请问波波老师,首先,究竟什么才是正确的刷题方法?其次,是否掌握了正确的方法后,就能在短时间内一次性写出像solution一样的最佳答案呢?

附上自己写的86题答案,供其他同学一起学习进步:)

public static ListNode partition(ListNode head, int x) {
if(head == null)
return null;

    //分情况讨论,看list的第一个数值是否小于x
    //如果小于x,则标记位置(对应变量s),并找到第一个大于x的节点作为pivot(对应变量st)
    //之后通过不断改变原有指针,先将所有小于x的节点串联,再讲所有大于x的节点串联
    //最后连接两部分
    if(head.val < x){
        ListNode s = head;
        //System.out.println("s now is "+s.val);
        while(s.next != null && s.next.val < x){
            s = s.next;
            //System.out.println("s now is "+s.val);
        }
        if(s.next == null){
            return head;
        }

        ListNode st = s.next;
        //System.out.println("st now is "+st.val);
        ListNode b = s.next;
        //System.out.println("b now is "+b.val);

        if(b.next == null){
            return head;
        }
        //到此为止,s, st, b都有了

        ListNode cur = b;
        //System.out.println("cur now is "+cur.val);
        while(cur.next != null){
            if(cur.next.val < x){
                s.next = cur.next;
                s = s.next;
                //System.out.println("s now is "+s.val);
            }
            else{
                //System.out.println(cur.val);
                //System.out.println(cur.next.val);
                b.next = cur.next;
                b = b.next;
                //System.out.println("b now is "+b.val);
            }
            cur = cur.next;
            //System.out.println("cur now is "+cur.val);
        }

        s.next = st;
        b.next = null;
    }

    else{
        ListNode b = head;
        ListNode st = b;

        while(b.next != null && b.next.val >= x){
            b = b.next;
        }
        if(b.next == null){
            return head;
        }

        ListNode s = b.next;
        head = s;

        if(s.next == null){
            s.next = st;
            b.next = null;
            return head;
        }
        //到此为止,s, st, b都有了

        ListNode cur = s;
        while(cur.next != null){
            if(cur.next.val >= x){
                b.next = cur.next;
                b = b.next;
            }
            else{
                //System.out.println(cur.val);
                //System.out.println(cur.next.val);
                s.next = cur.next;
                s = s.next;
            }
            cur = cur.next;
        }

        s.next = st;
        b.next = null;
    }

    return head;

}
写回答

1回答

liuyubobobo

2019-03-08

大赞!感谢分享!:)


首先,如果你之前并不经常刷Leetcode,或者并不经常编写和链表相关的逻辑,用40分钟得到正确的结果,已经是非常非常好了。我认为你比我有天赋。在我上学的时候,一个问题琢磨1-2天,对我来说是家常便饭:-(


其次,我必须说,你现在的刷题的方式,就是最佳的方式!

1)自己尝试;

2)对于自己有思路,认为能解决的问题,一定把他编出来。哪怕自己编的代码再“丑”,但你知道,就是这样的一个逻辑,既然他的解决方案不在你的知识盲区里,你有能力解决它;

3)面对debug不轻言放弃。逻辑都有了,为什么不能编出正确的代码,肯定可以的!

4)最终成功以后,看别人的解决方案,思考吸收别人解决方案中的优点,反思自己的代码的问题。为什么别人的代码可以更有效率或者更加简洁?哪些是自己忽视的?


进步,就发生在这个过程中!你现在所使用的方法,就是可以用最快的时间,让自己能够写出最佳答案的方法!

只是,这个“最快的时间”,可能会比你想象的长。这不是一周两周可能发生的蜕变,也不是一个月两个月可能发生的蜕变;但一年两年的时间,我敢肯定,你保持这个劲头,绝对会在编程上,会产生巨大的蜕变。不信的话,坚持下去,两年后,再回头来看看自己今天写的代码:)


向你推荐我的一篇文章,在我的公众号里。《天生不聪明》。https://mp.weixin.qq.com/s?__biz=MzU4NTIxODYwMQ==&mid=2247483856&idx=1&sn=47a72cee1190aefc06c24fea78f78484&chksm=fd8cae96cafb2780f2634bbeece1608f321ea2698523869ff6d0c58497ad2dfbf5fa1233b0dd&mpshare=1&scene=1&srcid=03088X0y4FMbESG3wAzfPpCP&pass_ticket=XChT1EuXK0BeGO3OItYIbOjXo9aGgpR8ghWdO5DsaGM%2FgKNxkQwWSAb4Z3YFXTkv#rd


坚持下去!通过你的描述,我敢肯定,你绝对是有天赋的人。不要浪费了自己的天赋。


加油!:)

1
2
软件工程小白菜
多谢老师鼓励,给出了正确的方法,我之前并不经常刷leetcode,但听了老师的话,之后会按照这个方法一步一步努力!
2019-03-08
共2条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7410 学习 · 1150 问题

查看课程