返回

几道面试必备的手写题

前端

在技术面试中,手写解题环节至关重要。面对这道考验,求职者必须快速、准确地展现自己的算法思维和编码能力。本文精选了几道面试高频手写题,帮助你备战面试,增加成功几率。

反转链表

题目:
给定一个链表的头节点,反转链表并返回新头节点。

解题思路:

  1. 初始化三个指针:current(指向当前节点)、prev(指向当前节点的前驱节点)和 next(指向当前节点的后继节点)。
  2. 迭代遍历链表,每次循环:
    • 更新 next 为 current 的后继节点。
    • 将 current 的后继节点指向 prev。
    • 将 prev 和 current 向后移动一位。
  3. 最终,prev 指向链表的新头节点,返回 prev。

代码示例:

def reverse_list(head):
    if not head or not head.next:
        return head

    current = head
    prev = None

    while current:
        next = current.next
        current.next = prev
        prev = current
        current = next

    return prev

判断回文串

题目:
给定一个字符串,判断它是否为回文串(正向和反向读起来相同)。

解题思路:

  1. 使用双指针 technique,从字符串的两端向中间遍历。
  2. 比较指针指向的字符,如果不相等,则返回 False。
  3. 如果指针相遇或越过,则返回 True。

代码示例:

def is_palindrome(s):
    left, right = 0, len(s) - 1

    while left < right:
        if s[left] != s[right]:
            return False
        left += 1
        right -= 1

    return True

查找最大子数组和

题目:
给定一个整型数组,找出连续子数组的和最大的子数组。

解题思路:

  1. 使用动态规划 technique,维护一个当前子数组的最大和(current_max)和最大和(max_so_far)。
  2. 对于数组中的每个元素:
    • 如果 current_max 加上该元素小于 0,则将 current_max 重置为 0。
    • 否则,将 current_max 加上该元素。
    • 更新 max_so_far 为 current_max 和 max_so_far 中的最大值。
  3. 返回 max_so_far。

代码示例:

def max_subarray_sum(arr):
    current_max = 0
    max_so_far = -float('inf')

    for i in range(len(arr)):
        current_max = max(arr[i], current_max + arr[i])
        max_so_far = max(max_so_far, current_max)

    return max_so_far

总结

掌握这些手写题的解题方法和技巧,将极大地提高你在技术面试中的竞争力。通过反复练习和深入理解,你可以培养出解决复杂算法问题的信心和能力。