赞
踩
华为上合面试二面手撕代码,给一个链表和一个数,将链表分为两部分,左边部分小于x,右边部分大于或等于x,保证两部分中节点的相对顺序与之前一致。
比如:
Input: head = 1->4->3->2->5->2, x = 3
Output: 1->2->2->4->3->5
这题我四个月前AC过,做得很大意当时没细想就AC了。由于手写和面试时间限制,一时之间又想不到自己从前的想法,很快有了思路写了下,大致是使用两个指针(当前最后一个小于x的节点和最后一个大于等于x的节点),不过还需要一个指针,保存第一个大于等于x的节点。遍历结束后,最后一个小于x的节点指向第一个大于等于x的节点。写完后,面试官就开始问别的问题,最后面试快结束让我讲一下思路。我就对着自己的代码讲。最后,面试官说专业二面通过了。聊得还行,面试官也很棒。说声谢谢,忐忑地等待三面。
其实,不见得是我的代码没问题,我觉得思路大致是对的,还是有些情况没有考虑:比如最后直接返回head,但没注意头节点必须为第一个小于x的节点;还比如最后一个大于等于x的节点要指向null。好在是手写,面试官也没太在意,放过我了,只是在我讲思路时,不时会对我翻白眼,当时我就在想为什么,好烦啊。现在终于知道了,这要是机考,就是重大BUG了。我还是太紧张了,抓到救命稻草(模糊的思路)就以为高枕无忧(代码AC),其实坑还挺多。不过手撕不比敲键盘,难受很多,我太难了。
严以律己,宽以待人!面试官仁慈,我要对自己要求高点。
把当时的思路复现,并且修改了BUG,时间和空间都是beats 100%,这就叫战胜自己!
public ListNode partition2(ListNode head, int x) {
ListNode p = head;
if(p == null) return head;
ListNode lastMin = null;
ListNode lastMax = null;ListNode firstMax = null;
while(p!=null){
if(p.val < x){
if(lastMin == null){
head = p;
}else{
lastMin.next = p;
}
lastMin = p;
}
else{
if(lastMax == null){
firstMax = p;
}else{
lastMax.next = p;
}
lastMax = p;
}
p = p.next;
}
if(lastMin != null)
lastMin.next = firstMax;
if(lastMax != null)
lastMax.next = null;
return head;
}
完蛋!当时缺乏注释,过了四个月再来看我看不懂了。看了好久发现,当时的思路是模仿插入排序的思路,因为过了,所以没深究。发现代码有点小bug,又改了下,时间和空间都是beats 100%。小小地得意下。
public ListNode partition(ListNode head, int x) {
ListNode p = head;
ListNode pre = null;//p's pre
ListNode gtxPre = null; // gtx's pre
ListNode gtx = null;
if(p == null) return head;
while(p!=null){
if(p.val >= x){
if(gtx == null){
gtx = p;
gtxPre = pre;
}
pre = p;
p = p.next;
}
else if(p.val < x){
if(gtx != null){ //need to adjust node's position
pre.next = p.next;
if(gtxPre != null){// gtx is not the head
gtxPre.next = p;
}
else{
head = p;
}
//摘下p,插入到gtx的前面
gtxPre = p;
p.next = gtx;
}else{
pre = p;
}
p = pre.next;
}
}
return head;
}
现在,也能对着自己的代码陶醉了,呵呵呵。
随便哪家,给个Offer吧~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。