在科技日新月异的今天,编程能力已成为职场竞争的重要筹码。而编程面试,作为进入理想公司的门槛,往往让许多求职者望而却步。为了帮助大家轻松掌握编程面试,本文将精选一些在线编程网站的面试题,并对其进行详细解析。
一、LeetCode
LeetCode 是全球最知名的在线编程社区之一,许多科技公司都将其作为面试题库。以下是一些经典的 LeetCode 面试题及解析:
1. 两数相加
题目描述:给定两个非空的链表表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解析:这是一个经典的链表操作题。我们需要遍历两个链表,将对应的数字相加,并处理进位问题。以下是用 Python 实现的代码示例:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def addTwoNumbers(l1, l2):
dummy = ListNode()
current = dummy
carry = 0
while l1 or l2 or carry:
sum = carry
if l1:
sum += l1.val
l1 = l1.next
if l2:
sum += l2.val
l2 = l2.next
carry = sum // 10
current.next = ListNode(sum % 10)
current = current.next
return dummy.next
2. 寻找两个正序数组的中位数
题目描述:给定两个大小为 m 和 n 的正序数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m+n))。
解析:这是一个二分查找题。我们可以通过比较两个数组的中位数来缩小查找范围,最终找到两个数组的中位数。以下是用 Python 实现的代码示例:
def findMedianSortedArrays(nums1, nums2):
m, n = len(nums1), len(nums2)
if m > n:
nums1, nums2, m, n = nums2, nums1, n, m
half_len = (m + n + 1) // 2
left, right = 0, m
while left < right:
i = (left + right) // 2
j = half_len - i
if nums1[i] < nums2[j - 1]:
left = i + 1
else:
right = i
if (m + n) % 2 == 0:
return (max(nums1[left - 1], nums2[j - 1]) + min(nums1[left], nums2[j])) / 2
else:
return max(nums1[left - 1], nums2[j - 1])
二、牛客网
牛客网是国内知名的编程社区,提供丰富的编程面试题库。以下是一些经典的牛客网面试题及解析:
1. 找出数组中重复的数字
题目描述:在一个长度为 n 的数组 nums 中,所有的数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出所有重复的数字,不需要考虑输出顺序。
解析:这是一个数组操作题。我们可以使用一个长度为 n 的布尔数组来标记数字是否重复。以下是用 Python 实现的代码示例:
def findRepeatNumber(nums):
if not nums:
return []
flag = [False] * len(nums)
res = []
for num in nums:
if flag[num]:
res.append(num)
else:
flag[num] = True
return res
2. 矩阵中的路径
题目描述:给定一个包含 m x n 个单元格的矩阵 board,从矩阵的左上角开始,每次只能向右或向下移动一步,编写一个函数,判断是否存在一条从左上角到右下角的路径,使得路径上的数字总和为特定值 target。
解析:这是一个深度优先搜索题。我们可以从左上角开始,递归地探索所有可能的路径,并判断路径上的数字总和是否等于 target。以下是用 Python 实现的代码示例:
def hasPath(board, target):
if not board:
return False
m, n = len(board), len(board[0])
visited = [[False] * n for _ in range(m)]
def dfs(i, j, target):
if i < 0 or i >= m or j < 0 or j >= n or visited[i][j] or board[i][j] != target:
return False
visited[i][j] = True
if i == m - 1 and j == n - 1:
return True
return dfs(i + 1, j, target) or dfs(i, j + 1, target)
return dfs(0, 0, target)
三、总结
通过以上对 LeetCode 和牛客网经典面试题的解析,相信大家对编程面试有了更深入的了解。在准备面试的过程中,建议多练习这些题目,并总结解题思路和技巧。同时,也要注重编程基础和算法思维的培养,这样才能在面试中脱颖而出。祝大家面试顺利!
