第 1 轮(在线编码轮):本轮在 Amcat 上举行。有2个编码问题。
-
给定二维矩阵。每个像元都有一个值 0 或 1。1 代表土地,0 代表水。找到岛屿的数量。
例子:Input: 1 1 0 0 1 0 Output: 2 0 0 1
方法:二维矩阵中的 DFS 并计算您必须执行 DFS 多少次才能覆盖所有 1。
-
您有一系列日志。每个日志都是一个以空格分隔的单词字符串。对于每个日志,每个日志中的第一个单词是一个字母数字标识符。然后,要么:
标识符后面的每个单词将仅由小写字母组成,或者;
- 标识符后面的每个单词将仅由数字组成。
- 我们将这两种日志称为字母日志和数字日志。保证每个日志在其标识符后至少有一个单词。
对日志重新排序,以便所有字母日志出现在任何数字日志之前。字母日志按字典顺序排列,忽略标识符,在关系的情况下使用标识符。数字日志应按其原始顺序放置。
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 上在线):第一位面试官介绍自己,然后我介绍自己。然后她问了我两个编码问题。
-
给定一个数组,大小为 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);
-
给定两个值 l 和 r。我必须在 l 到 r 之间找到特殊数字。特殊数字:相邻数字有 1 个特殊数字的精确绝对差:10, 12, 21, 23
所以,首先我给出了一个蛮力方法。遍历 l 到 r 并检查数字是否为特殊数字。这种方法的时间复杂度为 O(n*(位数))。所以,她让我优化更多。所以,我给出了一些不同的方法,最后,我给了她一个队列方法来解决这个问题。
链接: https : //www.geeksforgeeks.org/stepping-numbers/
第 3 轮(在 Amazon Chime 上在线):在这一轮中,面试官问了我 3 个编码问题和一些行为问题。首先是我和面试官的快速介绍。
-
有一个大小为 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; }
-
给出了一个大小为 n 的数组。 n 总是偶数。有两个玩家 A 和 B。对于每一轮,一个玩家可以从数组的开头或结尾获取一个元素。如果玩家获取其中一个元素,那么它将添加到该玩家的总和中并将其从数组中删除。两名球员都在发挥最佳状态。我必须找到玩家 A 达到的最大总和。
首先,我使用递归对指数方法进行了添加记忆,并采用自上而下的 DP 方法。她对我的做法很满意。
这是一个类似的问题: https : //www.geeksforgeeks.org/optimal-strategy-for-a-game-dp-31/
-
有一个字符串数组。数组中的所有字符串都是驼峰式的。每个字符串的缩写将是该字符串的大写字母。
我必须使 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年的经验。面试从我和面试官的快速介绍开始。
-
有一家小型玩具店,可以容纳Maximum X 玩具。店主已与一家玩具公司签订合同,该公司按时向店主提供货品。因此,在有一次新玩具到货时,玩具总数可能增加超过限制 X。因此,所有者必须移除商店中最先出现的那些玩具。所有者拥有上一年的销售数据,其中显示了特定时间销售的玩具数量。
我必须为两个查询创建一个数据结构。
- 当新玩具到货并且限制超过 X 时,哪些玩具将被移除。
- 从去年的数据返回最大销售的玩具。但是那个玩具应该在商店里。
对于第一个查询,我建议使用 deque 和 map 数据结构,对于第二个查询,我建议使用 map 和 max_heap 数据结构。我们讨论了这个方法,他对我的回答很满意。
-
他问了我一个编码问题。存在一棵二叉树。我必须将二叉树节点值更新为右子树的总和。叶节点应保持原样。
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。它对我的准备工作有很大帮助。
祝你好运…