📅  最后修改于: 2023-12-03 15:03:26.281000             🧑  作者: Mango
Oyo Rooms 是印度的一家酒店预订平台,旨在为旅行者提供舒适、安全、经济实惠的住宿选择。该公司成立于 2013 年,目前已经在印度、中国、日本、马来西亚、菲律宾、阿拉伯联合酋长国和英国等国家和地区设立了酒店。
我在 Oyo Rooms 的 SDE-1 面试中,经历了以下环节:
整个面试过程大约持续了 4 个小时左右。
面试官首先问了一些 Java 相关的基础问题,如 String、List 和 Map 等的区别及使用方法。接着,给了一道字符串处理的编程题目:
给定一个字符串 s,将 s 划分为尽可能多的子串,使得每个子串都是唯一的,求最多可以划分成几个子串。
例如,输入 s = "ababcbacadefegdehijhklij",输出 9,划分为 "ababcbaca", "defegde", "hijhklij"。
我的解法是使用贪心算法,从左到右遍历字符串,对于每个字符,都记录它最后一次出现的位置。然后再次遍历字符串,每次找到当前子串中最后一个字符的位置,将这个位置作为子串的分界点,不断重复这个过程直到遍历完整个字符串。
下面是我的代码:
public int maxUniqueSubstring(String s) {
int n = s.length();
Map<Character, Integer> map = new HashMap<>();
int res = 0, start = 0;
for (int end = 0; end < n; end++) {
char c = s.charAt(end);
if (map.containsKey(c)) {
start = Math.max(start, map.get(c) + 1);
}
map.put(c, end);
res = Math.max(res, end - start + 1);
}
return res;
}
面试官对我的代码进行了一些问答和优化,并问了 Java 中的垃圾回收机制。
面试官给了一道经典的算法题:Largest Rectangle in a Histogram(直方图中最大的矩形面积)。
题目描述:
给定一个直方图,每个柱子的宽度为 1,求其中的最大的矩形面积。
例如,给定直方图 [2,1,5,6,2,3],最大矩形面积为 10。
我的解法是通过单调栈来维护递增的矩形高度,每遇到一个小于栈顶高度的柱子,就弹出栈顶并计算面积。下面是我的代码:
public int largestRectangleArea(int[] heights) {
int n = heights.length;
int[] left = new int[n], right = new int[n];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < n; i++) {
while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {
stack.pop();
}
left[i] = stack.isEmpty() ? -1 : stack.peek();
stack.push(i);
}
stack.clear();
for (int i = n - 1; i >= 0; i--) {
while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {
stack.pop();
}
right[i] = stack.isEmpty() ? n : stack.peek();
stack.push(i);
}
int res = 0;
for (int i = 0; i < n; i++) {
res = Math.max(res, (right[i] - left[i] - 1) * heights[i]);
}
return res;
}
面试官对我的代码进行了一些问答和优化,并问了我在实际工作中使用过的算法和数据结构。
面试官给了我们一个在线聊天室的场景,并要求我们设计一个分布式的系统来支持这个场景,包括架构设计、API 设计、数据模型和数据存储等方面。
我首先考虑了系统的架构,设计了一个三层架构,包括 Web 层、应用层和数据层。Web 层负责接收用户请求和返回响应,应用层负责处理业务逻辑,数据层负责存储数据和提供数据访问接口。
接着,我开始设计 API,分别考虑了用户注册、登录、创建房间、加入房间、发送消息等基本功能。对于发送消息,我将其设计为异步处理,即用户发送消息后会将消息发送到一个 Kafka 队列中,由另一个消费者线程从队列中读取并存入数据库中。
最后,我设计了数据模型和数据存储方案。考虑到在线聊天室的消息数量较大,我选择了 NoSQL 数据库 Cassandra 作为数据存储。对于数据模型,我设计了三张数据表,包括用户表、房间表和消息表,使用 Cassandra 提供的多列索引实现了查询功能。
面试官对我的设计进行了一些问答,并补充了一些细节和优化建议。
整个面试过程考察了我的编程能力、算法和数据结构能力、系统设计能力以及英语沟通能力。整体难度较高,但是给予了充分的时间和支持。面试官还提供了很多有价值的反馈和建议,让我受益匪浅。