在求职过程中,算法题是面试官检验应聘者编程能力和逻辑思维的重要手段。以下列举了面试官常问的十大列表算法题,帮助你轻松掌握,提升面试成功率。
1. 两数之和
问题描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
示例:nums = [2, 7, 11, 15], target = 9,则返回 [0, 1]。
代码实现:
def twoSum(nums, target):
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
2. 移除元素
问题描述:给定一个数组 nums 和一个整数 val,请你在原地删除所有值为 val 的元素,并返回新的长度。
示例:nums = [3, 2, 2, 3], val = 3,则返回 2。
代码实现:
def removeElement(nums, val):
left = 0
for right in range(len(nums)):
if nums[right] != val:
nums[left] = nums[right]
left += 1
return left
3. 合并两个有序链表
问题描述:将两个有序链表合并为一个新的有序链表并返回。
示例:l1 = 1->2->4,l2 = 1->3->4,则返回 1->1->2->3->4。
代码实现:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def mergeTwoLists(l1, l2):
dummy = ListNode()
tail = dummy
while l1 and l2:
if l1.val < l2.val:
tail.next = l1
l1 = l1.next
else:
tail.next = l2
l2 = l2.next
tail = tail.next
tail.next = l1 or l2
return dummy.next
4. 两数相加
问题描述:给定两个非空的链表表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:l1 = 2->4->3,l2 = 5->6->4,则返回 7->0->8。
代码实现:
def addTwoNumbers(l1, l2):
dummy = ListNode()
tail = dummy
carry = 0
while l1 or l2 or carry:
val1 = l1.val if l1 else 0
val2 = l2.val if l2 else 0
total = val1 + val2 + carry
carry = total // 10
tail.next = ListNode(total % 10)
tail = tail.next
if l1:
l1 = l1.next
if l2:
l2 = l2.next
return dummy.next
5. 旋转数组
问题描述:给定一个数组,将其旋转一个给定数 k 的位置,其中 k 是非负数。
示例:nums = [1, 2, 3, 4, 5, 6, 7], k = 3,则返回 [5, 6, 7, 1, 2, 3, 4]。
代码实现:
def rotate(nums, k):
k %= len(nums)
nums[:] = nums[-k:] + nums[:-k]
6. 三数之和
问题描述:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0?找出所有满足条件且不重复的三元组。
示例:nums = [-1, 0, 1, 2, -1, -4],则返回 [[-1, 0, 1], [-1, -1, 2]]。
代码实现:
def threeSum(nums):
nums.sort()
result = []
for i in range(len(nums) - 2):
if i > 0 and nums[i] == nums[i - 1]:
continue
left, right = i + 1, len(nums) - 1
while left < right:
total = nums[i] + nums[left] + nums[right]
if total == 0:
result.append([nums[i], nums[left], nums[right]])
left += 1
right -= 1
while left < right and nums[left] == nums[left - 1]:
left += 1
while left < right and nums[right] == nums[right + 1]:
right -= 1
elif total < 0:
left += 1
else:
right -= 1
return result
7. 盛最多水的容器
问题描述:给定 n 个非负整数 a1,a2,…,an,请计算一个由这些整数组成的最大正方形的面积。
示例:height = [1, 8, 6, 2, 5, 4, 8, 3, 7],则返回 49。
代码实现:
def maxArea(height):
left, right = 0, len(height) - 1
max_area = 0
while left < right:
min_height = min(height[left], height[right])
max_area = max(max_area, min_height * (right - left))
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_area
8. 买卖股票的最佳时机 II
问题描述:给定一个数组,它的第 i 个元素是一支给定股票当天价格的整数。设计一个算法来计算你所能获取的最大利润。你可以完成尽可能多的交易(多次买卖一支股票)。
示例:prices = [7, 1, 5, 3, 6, 4],则返回 7。
代码实现:
def maxProfit(prices):
profit = 0
for i in range(1, len(prices)):
if prices[i] > prices[i - 1]:
profit += prices[i] - prices[i - 1]
return profit
9. 买卖股票的最佳时机 III
问题描述:给定一个数组,它的第 i 个元素是一支给定股票当天价格的整数。设计一个算法来计算你所能获取的最大利润。你最多只能完成两笔交易。
示例:prices = [3, 3, 5, 0, 0, 3, 1, 4],则返回 6。
代码实现:
def maxProfit(prices):
if not prices:
return 0
buy1, sell1, buy2, sell2 = float('-inf'), 0, float('-inf'), 0
for price in prices:
buy1 = max(buy1, -price)
sell1 = max(sell1, buy1 + price)
buy2 = max(buy2, sell1 - price)
sell2 = max(sell2, buy2 + price)
return sell2
10. 最长不上升子序列
问题描述:给定一个无序数组 nums,返回其最长不上升子序列的长度。
示例:nums = [10, 9, 2, 5, 3, 7, 101, 18],则返回 4。
代码实现:
def lengthOfLIS(nums):
if not nums:
return 0
dp = [1] * len(nums)
for i in range(1, len(nums)):
for j in range(i):
if nums[i] < nums[j]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
通过以上十道面试官常问的列表算法题,相信你已经对列表算法有了更深入的了解。在面试中,熟练掌握这些算法题,将大大提高你的面试成功率。祝你好运!
