记一次面试的失利

308 阅读3分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

前言

面试题

445. 两数相加 II 给定两个链表实现两数相加,链表顺序为正常数字顺序。

输入: l1 = [3,4,2], l2 = [4,6,5]
输出: [8,0,7]
解释: 342 + 465 = 807.

要求

    1. 5分钟思路分析,20分钟 coding。总时长最长30分钟。
    1. 在牛客网/飞书上写出可运行代码(有问题需要现场调试)。
    1. 测试用例与初始化数据结构需要自行 coding 。

结果

现场写的代码运行失败,现场调试也没能成功。

PS:我感觉我的代码应该没有问题~~~

正文

思路分析

此题就是如下两道 letcode 的合并,关于反转链表以及两数相加的实现逻辑可以查看 letcode 的题解。

下面就分析这道题目的大致思路:

  1. 反转两链表
  2. 两数相加
  3. 反转结果链表

代码实现

# 链表数据结构
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
        
    def travel(self):
        # 方便调试 打印出链接的结构
        root = self
        while root:
            print(root.val, end="->")
            root = root.next
        print("")
        
class Solution:
    
    def reverse(self, root):
        # 反转链表
        cur, head, prev = root, ListNode(0), None
        while cur:
            
            # 交换
            temp = cur.next
            cur.next = prev
            
            # 初始化
            prev = cur
            cur = temp
            
        return prev
    
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        
        # 两数之和
        l1 = self.reverse(l1)
        l2 = self.reverse(l2)

        res = ListNode(0)
        s_temp = 0
        cur = res
        while l1 or l2:

            l1_val = l1.val if l1 else 0
            l2_val = l2.val if l2 else 0

            total = l1_val + l2_val + s_temp

            cur.next = ListNode(total % 10)

            cur = cur.next
            s_temp = total // 10

            l1 = l1.next if l1 else l1
            l2 = l2.next if l2 else l2
        if s_temp != 0:
            cur.next = ListNode(s_temp)

        return self.reverse(res.next)
    
def main():
    first = ListNode(3, next=ListNode(4, next=ListNode(2)))
    second = ListNode(4, next=ListNode(6, next=ListNode(5)))   
    first.travel()
    second.travel()
    res = Solution().addTwoNumbers(first, second)
    res.travel()
main()

# 结果如下:
"""
3->4->2->
4->6->5->
8->0->7->
"""

简单的总结一下思路:

  1. 反转链表
  • 通过定义双指针指向当前节点与后继节点
  • 更新当前节点的后继节点 & 更新当前指针与后继指针
  • 最后返回新链表的头节点
  1. 两数之和

    本质上就是课本中列竖式计算多位数的和

  • 计算链表相同位置之和与十的除数与余数(余数为新节点名称、除数参与下一节点)。
  • 同时迭代指针位置直到节点均为空结束。
  • 注意最后一个节点存在有余数但没有节点 ( 9+1 的情况),需要在循环结束单独处理。

知识点

  • 基本数据结构链表的掌握
  • 反转链表算法思想 - 双指针

总结

原因

  • 紧张 面对面视频现场 coding,面试官的压迫感还是挺强的。
  • 习惯 由于以往的面试多数是现场面试在纸上 coding,类似牛客网、飞书这类型的模式首次尝试。
  • 菜 菜是原罪,上面两个都是次要的。

思考

  • 提升 coding 能力。多练习、多刷 letcode......
  • 刷 letcode 算法题的时候不要在自己习惯的编辑器中编写,尽量模拟面试中的真实情况
  • 谋定而后动 思路虽然不能直接体现 coding 能力,但是编程的基础
  • 面试的写代码的时候多使用编辑器的运行,现场 print 不丢人,毕竟面试官关心的是最后的结果