学习与做题中的困惑
来源: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回答
-
大赞!感谢分享!:)
首先,如果你之前并不经常刷Leetcode,或者并不经常编写和链表相关的逻辑,用40分钟得到正确的结果,已经是非常非常好了。我认为你比我有天赋。在我上学的时候,一个问题琢磨1-2天,对我来说是家常便饭:-(
其次,我必须说,你现在的刷题的方式,就是最佳的方式!
1)自己尝试;
2)对于自己有思路,认为能解决的问题,一定把他编出来。哪怕自己编的代码再“丑”,但你知道,就是这样的一个逻辑,既然他的解决方案不在你的知识盲区里,你有能力解决它;
3)面对debug不轻言放弃。逻辑都有了,为什么不能编出正确的代码,肯定可以的!
4)最终成功以后,看别人的解决方案,思考吸收别人解决方案中的优点,反思自己的代码的问题。为什么别人的代码可以更有效率或者更加简洁?哪些是自己忽视的?
进步,就发生在这个过程中!你现在所使用的方法,就是可以用最快的时间,让自己能够写出最佳答案的方法!
只是,这个“最快的时间”,可能会比你想象的长。这不是一周两周可能发生的蜕变,也不是一个月两个月可能发生的蜕变;但一年两年的时间,我敢肯定,你保持这个劲头,绝对会在编程上,会产生巨大的蜕变。不信的话,坚持下去,两年后,再回头来看看自己今天写的代码:)
坚持下去!通过你的描述,我敢肯定,你绝对是有天赋的人。不要浪费了自己的天赋。
加油!:)
122019-03-08
相似问题