📜  亚马逊面试经历| 188组(SDE1用)(1)

📅  最后修改于: 2023-12-03 15:36:06.125000             🧑  作者: Mango

亚马逊面试经历| 188组(SDE1用)

简介

本文是一位准备参加亚马逊SDE1职位面试的程序员的面经,面试过程分为五轮,包括 coding、system design、behavioral 和 hiring manager 面试。

面试流程
第一轮:coding

在 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

第二轮 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

在 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

在 behavioral 面试中,我被要求回答一些基础问题,例如工作经历、项目经验、技术选型以及如何解决问题等。

第五轮:hiring manager

在 hiring manager 面试中,我被要求回答一些管理相关的问题,例如如何管理团队、如何解决团队之间的合作问题、如何处理公司规则和流程等。

总结

亚马逊的面试考察了我的基础算法、系统设计、行为面试以及管理面试等方面,不仅考察了我的技术能力,也考察了我的逻辑思维、沟通能力和团队管理能力。通过这次面试,我发现我还有很多提升空间,需要不断地学习和思考。