在众多互联网公司中,字节跳动以其独特的面试风格和激烈的竞争而闻名。要想轻松过字节面试,掌握一些常见的编程题是必不可少的。本文将揭秘5道字节面试中必考的编程题,并提供详细的解题攻略,帮助你顺利通过面试。
1. 题目一:两数相加
题目描述:给定两个非空的链表表示两个非负的整数,其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解题思路:
- 创建一个新的链表作为结果。
- 初始化两个指针,分别指向两个链表的头部。
- 遍历两个链表,将对应的节点相加,并处理进位。
- 如果其中一个链表遍历完毕,则将另一个链表的剩余部分直接添加到结果链表。
- 处理进位,直到两个链表都遍历完毕。
代码示例:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def addTwoNumbers(l1, l2):
dummy = ListNode(0)
current = dummy
carry = 0
while l1 or l2 or carry:
val1 = l1.val if l1 else 0
val2 = l2.val if l2 else 0
sum_val = val1 + val2 + carry
carry = sum_val // 10
current.next = ListNode(sum_val % 10)
current = current.next
if l1:
l1 = l1.next
if l2:
l2 = l2.next
return dummy.next
2. 题目二:最长公共前缀
题目描述:编写一个函数来查找字符串数组中的最长公共前缀。
解题思路:
- 如果字符串数组为空,则返回空字符串。
- 取第一个字符串作为基准字符串。
- 遍历数组中的每个字符串,比较与基准字符串的前缀。
- 如果找到公共前缀,则更新基准字符串为当前字符串。
- 如果遍历完数组后没有找到公共前缀,则返回空字符串。
代码示例:
def longestCommonPrefix(strs):
if not strs:
return ""
prefix = strs[0]
for s in strs:
while not s.startswith(prefix):
prefix = prefix[:-1]
if not prefix:
return ""
return prefix
3. 题目三:合并区间
题目描述:以数组形式给出若干个区间,请合并所有重叠的区间。
解题思路:
- 将区间按照起始值排序。
- 遍历排序后的区间,比较当前区间与前一个区间的结束值。
- 如果当前区间的起始值小于前一个区间的结束值,则合并两个区间。
- 如果当前区间的起始值大于前一个区间的结束值,则将当前区间添加到结果列表。
代码示例:
def merge(intervals):
if not intervals:
return []
intervals.sort(key=lambda x: x[0])
merged = [intervals[0]]
for i in range(1, len(intervals)):
prev = merged[-1]
curr = intervals[i]
if prev[1] >= curr[0]:
merged[-1] = [prev[0], max(prev[1], curr[1])]
else:
merged.append(curr)
return merged
4. 题目四:二叉树的层序遍历
题目描述:给定一个二叉树,返回其节点值的层序遍历(从左到右,逐层遍历)。
解题思路:
- 创建一个队列,并将根节点入队。
- 遍历队列,每次从队列中取出一个节点,并将其子节点入队。
- 将当前节点的值添加到结果列表中。
- 重复步骤2和3,直到队列为空。
代码示例:
from collections import deque
def levelOrder(root):
if not root:
return []
result = []
queue = deque([root])
while queue:
level_size = len(queue)
level = []
for _ in range(level_size):
node = queue.popleft()
level.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
result.append(level)
return result
5. 题目五:最长连续序列
题目描述:给定一个未排序的整数数组,找出最长连续序列的长度。
解题思路:
- 使用一个集合存储数组中的所有元素。
- 遍历数组,对于每个元素,检查它是否是某个连续序列的开始。
- 如果是,则计算该序列的长度,并更新最长连续序列的长度。
- 返回最长连续序列的长度。
代码示例:
def longestConsecutive(nums):
if not nums:
return 0
nums_set = set(nums)
longest = 0
for num in nums:
if num - 1 not in nums_set:
current_num = num
current_length = 1
while current_num + 1 in nums_set:
current_num += 1
current_length += 1
longest = max(longest, current_length)
return longest
通过以上5道编程题的攻略,相信你已经对字节面试的编程题有了更深入的了解。在面试前,多加练习和总结,相信你一定能够轻松过字节面试!
