华为二面手撕代码leetcode中等难度链表题

华为上合面试二面手撕代码,给一个链表和一个数,将链表分为两部分,左边部分小于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吧~~

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
华为leetcode是指华为面试中要求候选人现场leetcode目。这种面试方式常用于评估候选人的编程能力和解决问的能力。 使用华为leetcode的优点是能够直接考察候选人的编程能力和思维逻辑。面试官可以根据候选人的解过程和代码实现来评估其算法和编程能力,从而更直观地了解候选人的能力水平。 使用这种面试方式还可以考察候选人在时间有限的情况下解决问的能力。编码要求候选人在短时间内完成编写算法和实现代码。这种情况下,候选人需要通过灵活运用算法知识、代码实现技巧和系统思考能力,快速找到解决问的方法。 然而,华为leetcode也存在一定的局限性。一方面,leetcode可能只考察候选人的算法和编程能力,而忽略了其他的技术要求,如系统设计、代码架构等。另一方面,由于目限定在leetcode库中,候选人可能通过事先刷来准备,从而提前得到目的答案,影响面试评估的公正性。 为了克服这些限制,华为还会在面试中结合其他的问和项目经验,综合评估候选人的整体能力。此外,华为还会要求候选人进行coding test,即在指定时间内以线上编码的方式解决问,更直观地了解候选人的编码能力。 总的来说,华为leetcode是一种评估候选人编程能力和解决问能力的有效方式,但也需要综合考虑其他方面的能力和筛选方法,以评估候选人的真实水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wsws100

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值