Adobe 计算机科学家面试经验-1
CS-1 的 Adobe 面试体验,位于班加罗尔。我将在这篇文章中分享我的经验。我有大约 5 年的Java开发人员(后端)工作经验。面试是他们招聘活动的一部分,所有面试轮次都是在线进行的。面试官非常乐于助人。
第1轮:
- 给定一个具有所有唯一元素的排序数组。和目标总和。查找数组中是否存在以sum为targetSum的一对元素。
eg: Arr={4, 5, 8, 10, 12, 15, 20} targetSum = 23 Op: Yes. (8, 15)
Java
/*package whatever //do not write package name here */ public int[] findPair(int[] arr, int sum) { int[] res = new int[2]; int l = 0; int r = arr.length - 1; while (l < r) { int temp = arr[l] + arr[r]; if (temp > sum) r--; else if (temp < sum) l++; else { res[0] = arr[l]; res[1] = arr[r]; break; } } return res; }
Java
/*package whatever //do not write package name here */ Node getSecondMax(Node root) { return util(root, null); } Node util(Node root, Node prev) { if (root == null) return root; if (root.right != null) { prev = root; return util(root.right, prev); } else { if (root.left == null) return prev; else return getRight(root.left); } } Node getRight(Node root) { if (root == null) return root; if (root.right == null) return root; if (root.right != null) return getRight(root.right); }
Java
/*package whatever //do not write package name here */ public void kSmallestElements(int[] arr, int k) { // Max heap PriorityQueue
pq = new PriorityQueue ( Collections.reverseOrder()); if (k >= arr.length) { for (int i : arr) System.out.print(i + " "); return; } for (int i = 0; i < k; i++) { pq.add(arr[i]); } for (int i = k; i < arr.length; i++) { int max = pq.peek(); if (arr[i] < max) { pq.poll(); pq.add(arr[i]); } } for (int i = 0; i < k; i++) { System.out.print(pq.poll() + " "); } } - 给定一个不平衡的二叉搜索树。找到树中第二高的元素。
Java
/*package whatever //do not write package name here */ Node getSecondMax(Node root) { return util(root, null); } Node util(Node root, Node prev) { if (root == null) return root; if (root.right != null) { prev = root; return util(root.right, prev); } else { if (root.left == null) return prev; else return getRight(root.left); } } Node getRight(Node root) { if (root == null) return root; if (root.right == null) return root; if (root.right != null) return getRight(root.right); }
第二轮:系统设计
- 设计一个在线播放列表,具有向最终用户公开的以下功能。
- 按艺术家姓名/歌曲名称/流派/发行年份/专辑名称搜索
- 按发布年份/编号排序。点击次数(喜欢)
- 推荐类似的播放列表
- 从上次保存的点恢复播放列表
第三轮:经理轮
- 给定一个未排序整数数组和一个值 k。从数组中找出 k 个最小的元素。
eg: arr={6,3,6,2,2,4,7} k=4 op: 2,2,3,4
Java
/*package whatever //do not write package name here */ public void kSmallestElements(int[] arr, int k) { // Max heap PriorityQueue
pq = new PriorityQueue ( Collections.reverseOrder()); if (k >= arr.length) { for (int i : arr) System.out.print(i + " "); return; } for (int i = 0; i < k; i++) { pq.add(arr[i]); } for (int i = k; i < arr.length; i++) { int max = pq.peek(); if (arr[i] < max) { pq.poll(); pq.add(arr[i]); } } for (int i = 0; i < k; i++) { System.out.print(pq.poll() + " "); } } - 系统设计:设计一个在线航班预订系统,具有以下特点:
- 搜索指定日期目的地之间的航班
- 订机票
- 检索用户的预订
第 4 轮:
- 最后一轮由一位资深人士参与,可能是工程总监,他让我设计一个系统,让多个用户在 BookMyShow 等应用程序中预订同一个座位。多个用户同时预订同一个资源时如何处理并发。
结果: 2天后我接到HR的电话,说我被选中了。