📅  最后修改于: 2023-12-03 15:05:07.527000             🧑  作者: Mango
作为一名 SDE-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
在一收藏家的房间内,有若干个可以挂在墙上的画。每个画有唯一的高度和宽度。 如果两幅画的高度和宽度分别都不相同,则认为它们是相似的。收藏家现在想要选择 最多(不是最少)不相似的画,问最大能选多少幅画?
分析:
将画按照高度或宽度排序,再计算最长的不相似画的数量。首先排序可以使得相同的画更容易识别,然后我们计算并返回不相似画的数量。本题与最长不相同子序列问题是等价的。
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]
给定一个整数数组,找出其中两个数,使它们的和等于目标值。 注意事项: 你可以假设每个输入肯定有一个解,而且每个元素只用一次。
分析:
这道问题可以使用哈希表,根据之前的经验,我们可以将元素代号往字典存,并在找到以下查询键值对时终止循环。为了避免重复值的初始化,建议在执行查询之前就建立哈希表。
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
上述总结的内容总结个人的亚马逊面试所得,在实践中请根据实际情况抉择。希望本文能帮到你成功通过亚马逊的面试。