📜  亚马逊面试经历 |设置 255(校内)(1)

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

亚马逊面试经历 | 设置 255(校内)

背景

本文是一位程序员在亚马逊的面试经历。这次面试是在校内设置的,共设置了255名面试者。在此之前,该程序员已经准备了几个月,认真学习了数据结构、算法和操作系统等知识。

面试题目

面试共分为两轮,每轮45分钟。

第一轮

第一轮面试官提供了以下问题:

  1. 实现一个 LRU(Least Recently Used)缓存,支持get和put操作。

    class LRUCache:
        def __init__(self, capacity: int):
            """
            :type capacity: int
            """
            self.capacity = capacity
            self.cache = {}
            self.queue = []
        
        def get(self, key: int) -> int:
            """
            :type key: int
            """
            if key in self.cache:
                self.queue.remove(key)
                self.queue.append(key)
                return self.cache[key]
            
            return -1
    
        def put(self, key: int, value: int) -> None:
            """
            :type key: int
            :type value: int
            """
            if key in self.cache:
                self.queue.remove(key)
            elif len(self.cache) >= self.capacity:
                remove_key = self.queue.pop(0)
                del self.cache[remove_key]
          
            self.cache[key] = value
            self.queue.append(key)
    
  2. 给定一个字符串,返回其中不含重复字符的最长子串的长度。例如,给定"abcabcbb",应该返回3,因为最长不含重复字符的子串是"abc";给定"bbbbb",应该返回1,因为最长不含重复字符的子串是"b"。

    class Solution:
        def lengthOfLongestSubstring(self, s: str) -> int:
            """
            :type s: str
            """
            if not s:
                return 0
            
            max_len = cur_len = 0
            lookup = set()
            for i in range(len(s)):
                cur_len += 1
                while s[i] in lookup:
                    lookup.remove(s[i - cur_len])
                    cur_len -= 1
                if cur_len > max_len:
                    max_len = cur_len
                lookup.add(s[i])
            
            return max_len
    
第二轮

第二轮面试官提供了以下问题:

  1. 有一个n x n的矩阵表示一个图像。将图像逆时针旋转90度。要求使用原地算法。

    class Solution:
        def rotate(self, matrix: List[List[int]]) -> None:
            """
            :type matrix: List[List[int]]
            """
            n = len(matrix[0])
            for i in range(n // 2):
                for j in range(i, n - i - 1):
                    tmp = matrix[i][j]
                    matrix[i][j] = matrix[n - 1 - j][i]
                    matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j]
                    matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i]
                    matrix[j][n - 1 - i] = tmp
    
  2. 给定一个长度为n的数组,找到其中的一个出现次数超过n/2的元素。假设该元素一定存在。要求使用O(n)时间复杂度和O(1)空间复杂度的算法。

    class Solution:
        def majorityElement(self, nums: List[int]) -> int:
            """
            :type nums: List[int]
            """
            candidate, count = None, 0
            for num in nums:
                if count == 0:
                    candidate, count = num, 1
                else:
                    count += 1 if num == candidate else -1
            
            return candidate
    
总结

虽然这次面试题目并不是非常难,但是因为面试官所选择的题目涵盖了常见的算法和数据结构问题,并且有一些问题需要进行原地算法的实现,使得整个面试过程都非常有启发性。

在准备这次面试时,该程序员重点掌握了数据结构、算法和操作系统的知识,并多次尝试在纸上或者电脑上手写代码。这些尝试对于在面试现场能够更加流畅地完成题目提供了非常大的帮助。