📌  相关文章
📜  SDE-1 的亚马逊面试经验 |校外 2021(1)

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

SDE-1 的亚马逊面试经验 | 校外 2021

介绍

作为一名 SDE-1,我在接受亚马逊面试时有了一些经验和心得,想把这些分享给其他程序员,希望对大家有所帮助。下面是我的面试经验和几个面试题目的分析与解答。

面试经验
  1. 在面试前,务必做好充足准备。多刷题,多看算法书籍,并研究亚马逊的技术栈和文化,对自己所熟悉的技能进行深入学习。
  2. 在面试中一定要仔细听清问题,在进行代码实现之前一定要和面试官确认自己的理解是否正确。如果没有理解清楚问题,就很难求得正确答案。
  3. 在协同编程时,和面试官之间要有良好的沟通和合作,更需要使用好语言和代码的风格,使得大家看起来协调一致。当然,你需要时刻关注时间和空间复杂度的问题。
  4. 最后,当你写完代码,给出答案时,尽可能地演示自己的算法思路和代码逻辑。如果有时间,还要提出改进,指出自己的不足以及优化的方法。这样可以展示自己对于算法思考的深度。
问题分析及解答
问题 1

在一个整数数组中,查找目标数字的个数。要求时间复杂度为 O(log n)。

分析:

这道题用二分查找思路,先确定目标数字的位置,再向左右两侧查找。利用 logn 的复杂度,在每个层上分别考虑减化问题,并在之前逐步缩小扫描范围,最终达到目标时间复杂度。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        def search_left(nums, target):
            left, right = 0, len(nums)
            while left < right:
                mid = (left + right) // 2
                if nums[mid] < target:
                    left = mid + 1
                else:
                    right = mid
            return left
        
        def search_right(nums, target):
            left, right = 0, len(nums)
            while left < right:
                mid = (left + right) // 2
                if nums[mid] <= target:
                    left = mid + 1
                else:
                    right = mid
            return left
        
        left = search_left(nums, target)
        if left == len(nums) or nums[left] != target:
            return 0
        return search_right(nums, target) - left
        
问题 2

在一收藏家的房间内,有若干个可以挂在墙上的画。每个画有唯一的高度和宽度。 如果两幅画的高度和宽度分别都不相同,则认为它们是相似的。收藏家现在想要选择 最多(不是最少)不相似的画,问最大能选多少幅画?

分析:

将画按照高度或宽度排序,再计算最长的不相似画的数量。首先排序可以使得相同的画更容易识别,然后我们计算并返回不相似画的数量。本题与最长不相同子序列问题是等价的。

class Solution:
    def maxUncrossedLines(self, nums1: List[int], nums2: List[int]) -> int:
        dp = [[0] * (len(nums2) + 1) for _ in range(len(nums1) + 1)]
        for i, num1 in enumerate(nums1):
            for j, num2 in enumerate(nums2):
                dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j])
                if num1 == num2:
                    dp[i+1][j+1] = max(dp[i+1][j+1], dp[i][j]+1)
        return dp[-1][-1]
问题 3

给定一个整数数组,找出其中两个数,使它们的和等于目标值。 注意事项: 你可以假设每个输入肯定有一个解,而且每个元素只用一次。

分析:

这道问题可以使用哈希表,根据之前的经验,我们可以将元素代号往字典存,并在找到以下查询键值对时终止循环。为了避免重复值的初始化,建议在执行查询之前就建立哈希表。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dic = {}
        for i, num in enumerate(nums):
            if target - num in dic:
                return [dic[target-num], i]
            dic[num] = i        
总结

上述总结的内容总结个人的亚马逊面试所得,在实践中请根据实际情况抉择。希望本文能帮到你成功通过亚马逊的面试。