📅  最后修改于: 2023-12-03 15:36:06.125000             🧑  作者: Mango
本文是一位准备参加亚马逊SDE1职位面试的程序员的面经,面试过程分为五轮,包括 coding、system design、behavioral 和 hiring manager 面试。
在 coding 面试中,我被要求完成两个题目。
题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请在数组中找到两个数字,它们相加等于目标值。返回这两个数字的下标。
示例:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9,返回 [0, 1]。
解题思路:
使用哈希表,依次将元素存入表中,每次检查表中是否有 target - nums[i],如果有,则返回对应下标。
代码片段:
def twoSum(nums: List[int], target: int) -> List[int]:
table = {}
for i, num in enumerate(nums):
if target - num in table:
return [table[target - num], i]
else:
table[num] = i
题目描述:
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。不允许两个字符映射到同一个字符上,但字符可以映射自己本身。
示例:
输入: s = "egg", t = "add"
输出: true
解题思路:
使用哈希表,依次将 s 和 t 中的字符遍历一遍,如果在表中出现过则判断是否对应,否则在表中记录对应关系。
代码片段:
def isIsomorphic(s: str, t: str) -> bool:
st, ts = {}, {}
for i in range(len(s)):
if s[i] in st and st[s[i]] != t[i]:
return False
elif t[i] in ts and ts[t[i]] != s[i]:
return False
else:
st[s[i]] = t[i]
ts[t[i]] = s[i]
return True
第二轮 coding 面试仍然是两道题。
题目描述:
给定一个整数数组 nums 和一个整数 k,请判断是否存在两个不同的下标 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
示例:
输入: nums = [1,2,3,1], k = 3
输出: true
解题思路:
使用哈希表记录出现过的元素最后一次出现的下标,每次检查当前元素是否已经在哈希表中出现过,如果出现过则计算下标之差是否小于等于 k。
代码片段:
def containsNearbyDuplicate(nums: List[int], k: int) -> bool:
pos = {}
for i in range(len(nums)):
if nums[i] in pos and i - pos[nums[i]] <= k:
return True
pos[nums[i]] = i
return False
题目描述:
设计一个简单的推特。
示例:
> postTweet(userId, tweetId): 创建一条新的推文
> getNewsFeed(userId): 检索最近的十条推文。每个推文都必须是由此用户关注的人或者是用户本身发出的。推文必须按照时间顺序由最近的开始排列。
> follow(followerId, followeeId): 关注一个用户
> unfollow(followerId, followeeId): 取消关注一个用户
解题思路:
使用哈希表存储每个用户发送过的推文,并使用链表维护每个用户的关注列表。每次获取推特动态时,从用户发送的推文中选取最后十条最新的推文,并根据推文作者是否为该用户或该用户关注的人来做筛选。
代码片段:
from collections import defaultdict, deque
class Twitter:
def __init__(self):
self.tweets = defaultdict(deque)
self.followers = defaultdict(set)
self.time = 0
def postTweet(self, userId: int, tweetId: int) -> None:
self.tweets[userId].appendleft((tweetId, self.time))
self.time += 1
def getNewsFeed(self, userId: int) -> List[int]:
feed, tweets = [], self.tweets
for uid in [userId] + list(self.followers[userId]):
feed += tweets[uid]
feed.sort(key=lambda x: x[1], reverse=True)
return [x[0] for x in feed[:10]]
def follow(self, followerId: int, followeeId: int) -> None:
if followeeId != followerId:
self.followers[followerId].add(followeeId)
def unfollow(self, followerId: int, followeeId: int) -> None:
if followeeId != followerId:
self.followers[followerId].discard(followeeId)
在 system design 面试中,我被要求设计一个短链接系统。
解题思路:
设计思路就是将长链接转换成短链接然后存储,在查询短链接时再将短链接转换成长链接。可以使用两个哈希表分别存储长链接和短链接与编号的对应关系。将长链接通过 hash 函数映射到不同的数字,再将数字转换成字母和数字,使得短链接更短,可以使用一些开源的 hash 函数库。
代码片段:
class UrlShortener:
def __init__(self):
self.urls, self.urls2 = {}, {}
self.base62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
def hash(self, longUrl: str) -> str:
code = hash(longUrl)
shortUrl = ""
while code:
code, idx = divmod(abs(code), 62)
shortUrl += self.base62[idx]
return shortUrl
def encode(self, longUrl: str) -> str:
if longUrl in self.urls:
return self.urls[longUrl]
else:
shortUrl = self.hash(longUrl)
self.urls[longUrl], self.urls2[shortUrl] = shortUrl, longUrl
return shortUrl
def decode(self, shortUrl: str) -> str:
return self.urls2[shortUrl]
在 behavioral 面试中,我被要求回答一些基础问题,例如工作经历、项目经验、技术选型以及如何解决问题等。
在 hiring manager 面试中,我被要求回答一些管理相关的问题,例如如何管理团队、如何解决团队之间的合作问题、如何处理公司规则和流程等。
亚马逊的面试考察了我的基础算法、系统设计、行为面试以及管理面试等方面,不仅考察了我的技术能力,也考察了我的逻辑思维、沟通能力和团队管理能力。通过这次面试,我发现我还有很多提升空间,需要不断地学习和思考。