📜  亚马逊 SDE 面试体验 |校外(1-1.5 年经验)

📅  最后修改于: 2021-09-23 05:31:27             🧑  作者: Mango

第 1 轮(在线编码轮):本轮在 Amcat 上举行。有2个编码问题。

  1. 给定二维矩阵。每个像元都有一个值 0 或 1。1 代表土地,0 代表水。找到岛屿的数量。
    例子:

    Input:  1 1 0
            0 1 0        
    Output: 2
            0 0 1

    方法:二维矩阵中的 DFS 并计算您必须执行 DFS 多少次才能覆盖所有 1。

  2. 您有一系列日志。每个日志都是一个以空格分隔的单词字符串。对于每个日志,每个日志中的第一个单词是一个字母数字标识符。然后,要么:

    标识符后面的每个单词将仅由小写字母组成,或者;

    • 标识符后面的每个单词将仅由数字组成。
    • 我们将这两种日志称为字母日志和数字日志。保证每个日志在其标识符后至少有一个单词。

    对日志重新排序,以便所有字母日志出现在任何数字日志之前。字母日志按字典顺序排列,忽略标识符,在关系的情况下使用标识符。数字日志应按其原始顺序放置。

    logs = ["dig1 8 1 5 1",
            "let1 art can","dig2 3 6",
            "let2 own kit dig",
            "let3 art zero"]
    Output: ["let1 art can",
            "let3 art zero",
            "let2 own kit dig",
            "dig1 8 1 5 1",
            "dig2 3 6"]

    方法:将字母日志和数字日志分开。然后使用自己的比较器对字母日志进行排序,然后合并字母日志和数字日志。在解决了这些问题之后,有一个部分我必须用文字写出方法,并且必须写出时间和空间复杂度。之后,有一个工作生活调查和反馈调查部分。这一轮之后,我收到了我通过在线编码轮的邮件,等待进一步的沟通。

几周后,我收到了邮件,并在一天内安排了三轮面试。

第 2 轮(在 Amazon Chime 上在线):第一位面试官介绍自己,然后我介绍自己。然后她问了我两个编码问题。

  1. 给定一个数组,大小为 N,每个索引都有一个 >=0 的值。这个值代表我可以走得更远的最大步数。我必须找到多种方法来到达数组的末尾。如果不可能,则返回-1。

    Input: 1 2 1 4
    Output: 2

    解释: arr[0] = 1 所以,我只能去索引 1
    arr[1] = 2 所以,从这里我可以去索引 2nd 和 3rd。
    arr[2] = 1 从这里我可以转到索引 3。
    到达数组末尾的可能路径:0->1->2->3
    0->1->3
    答案: 2

    方法:从末尾开始,从当前索引到可能到达的索引,求从该索引到达末尾的路数之和。从右到左对所有索引执行此操作,您将获得到达数组末尾的方法数。

    Input: 1 2 1 4
    Output: 2 2 1 1

    解释:

    • 对于第三个索引:它已经结束所以设置为 1
    • 第二个索引:arr[2] = 1 所以,从答案中取索引 3 的总和并更新答案数组 ans[2] = 1
    • 第一个索引: arr[1] =2 所以,从答案数组 ans[1] = 2 中取索引 2 和 3 的总和
    • 第 0 个索引: arr[0] =1 因此,从答案数组中取第 1 个索引的总和。答案[0] = 2;
    • 最后返回 ans[0];
    • 边缘情况 N=1 返回 0。
    • 时间复杂度:O(n^2);
  2. 给定两个值 l 和 r。我必须在 l 到 r 之间找到特殊数字。特殊数字:相邻数字有 1 个特殊数字的精确绝对差:10, 12, 21, 23

    所以,首先我给出了一个蛮力方法。遍历 l 到 r 并检查数字是否为特殊数字。这种方法的时间复杂度为 O(n*(位数))。所以,她让我优化更多。所以,我给出了一些不同的方法,最后,我给了她一个队列方法来解决这个问题。

    链接: https : //www.geeksforgeeks.org/stepping-numbers/

第 3 轮(在 Amazon Chime 上在线):在这一轮中,面试官问了我 3 个编码问题和一些行为问题。首先是我和面试官的快速介绍。

  1. 有一个大小为 NxM 的二维矩阵。每个单元格都有一个正值。从每个单元格中,我只能向右对角向下或向右对角向上移动。我必须找到从第一列单元格到最后一列单元格的最大总和路径。我给出了 O(n^2) 方法,她对此很满意。

    C++
    int solution(vector > arr, int n, int m)
    {
        int dp[n][m];
      
        memset(dp, sizeof(dp), -1);
        int ans = 0;
        for (int col = 0; col < m; col++) {
            for (int row = 0; row < n; row++) {
                int temp = 0;
                if (row - 1 >= 0 && col - 1 >= 0)
                    temp = max(temp, dp[row - 1][col - 1]);
                if (row + 1 < n && col - 1 >= 0)
                    temp = max(temp, dp[row + 1][col - 1])
      
                dp[row][col] = arr[row][col] + temp;
                ans = max(ans, dp[row][col]);
            }
        }
      
        return ans;
    }


    C++
    int solution(Node* root){
        if(root == NULL) return;
            
          if(root->left==NULL && root->right==NULL)
              return root->data;
        
          int left_sum = solution(root->left);
          int right_sum = solution(root->right);
        
          int temp = root->data;
          
          root->data = right_sum;
            
        return left_sum + temp + right_sum; 
    }


  2. 给出了一个大小为 n 的数组。 n 总是偶数。有两个玩家 A 和 B。对于每一轮,一个玩家可以从数组的开头或结尾获取一个元素。如果玩家获取其中一个元素,那么它将添加到该玩家的总和中并将其从数组中删除。两名球员都在发挥最佳状态。我必须找到玩家 A 达到的最大总和。

    首先,我使用递归对指数方法进行了添加记忆,并采用自上而下的 DP 方法。她对我的做法很满意。

    这是一个类似的问题: https : //www.geeksforgeeks.org/optimal-strategy-for-a-game-dp-31/

  3. 有一个字符串数组。数组中的所有字符串都是驼峰式的。每个字符串的缩写将是该字符串的大写字母。

    我必须使 API 输入作为缩写,并且必须返回其中缩写以输入缩写作为前缀的所有字符串。

    例子:

    String array:
    GoodMorning
    Good
    GoodNight
    LightHouse
    Abbreviation of the above strings will be:
    GM
    G
    GN
    LH
    Query:
    Input: G
    Output: GoodMorning, Good, GoodNight
    Input: GM
    Output: GoodMorning

    对于这个问题,我给出了两种方法。首先使用地图。我将键存储为缩写的前缀,将值存储为字符串向量,该字符串的缩写中将此键作为前缀。
    我给出的第二种方法是使用 Trie 数据结构。她让我实现一种地图方法并写出空间和时间复杂度。

之后,她问了一些基于亚马逊领导原则的行为问题。这次采访持续大约一个半小时。

第 4 轮(在 Amazon Chime 上在线):这次采访完全基于亚马逊的领导原则。面试从我和面试官的快速介绍开始。他问了我目前公司面临的一些情况,我是如何处理的,结果如何。这一轮是更具互动性的一轮。他问了我两个小问题。首先是什么是线程和进程以及它们之间的区别。然后他让我解释hashmap和hashtable。我知道 hashmap 和 hashtable 是Java的概念,我的完整经验是 C++。所以他让我解释地图和无序地图之间的区别及其内部工作。本次采访持续约 40 分钟。

在第 3 轮的 2 周后,我收到了邮件,并与软件开发经理进行了第 4 轮。

第5轮(Bar Raiser)(Amazon Chime在线):面试官是软件开发经理,在亚马逊有9年的经验。面试从我和面试官的快速介绍开始。

  1. 有一家小型玩具店,可以容纳Maximum X 玩具。店主已与一家玩具公司签订合同,该公司按时向店主提供货品。因此,在有一次新玩具到货时,玩具总数可能增加超过限制 X。因此,所有者必须移除商店中最先出现的那些玩具。所有者拥有上一年的销售数据,其中显示了特定时间销售的玩具数量。

    我必须为两个查询创建一个数据结构。

    • 当新玩具到货并且限制超过 X 时,哪些玩具将被移除。
    • 从去年的数据返回最大销售的玩具。但是那个玩具应该在商店里。

    对于第一个查询,我建议使用 deque 和 map 数据结构,对于第二个查询,我建议使用 map 和 max_heap 数据结构。我们讨论了这个方法,他对我的回答很满意。

  2. 他问了我一个编码问题。存在一棵二叉树。我必须将二叉树节点值更新为右子树的总和。叶节点应保持原样。

    Input                   Output
      1                       16
     2  3                   5    7 
    4 5 6 7                4  5 6 7
    
    

    C++

    int solution(Node* root){
        if(root == NULL) return;
            
          if(root->left==NULL && root->right==NULL)
              return root->data;
        
          int left_sum = solution(root->left);
          int right_sum = solution(root->right);
        
          int temp = root->data;
          
          root->data = right_sum;
            
        return left_sum + temp + right_sum; 
    }
    

他根据亚马逊的领导原则问了我一些行为问题。我们对每个问题都进行了健康的讨论。对于每个行为问题,我必须解释情况,每种情况都与当前公司的项目有关。他问了很多问题,我们讨论了这个问题。

几天后,我收到了一封邮件,说我被选为 SDE-1 配置文件🙂

提示:

  • 尽可能多地与面试官互动。如果您不知道问题的解决方案,请告诉面试官您的想法。如果您与他们互动,面试官会非常有帮助,他们会指导您找到解决方案。
  • 编写干净且可用于生产的代码并涵盖所有边缘情况。面试官用测试用例检查你的解决方案。
  • 首先,给出蛮力方法,然后转向优化方法。对于每个问题,他们都想要一个优化的解决方案

谢谢,GeeksforGeeks。它对我的准备工作有很大帮助。

祝你好运…