📜  Oyo Rooms 面试体验 | SDE-1(1)

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

Oyo Rooms 面试体验 | SDE-1

简介

Oyo Rooms 是印度的一家酒店预订平台,旨在为旅行者提供舒适、安全、经济实惠的住宿选择。该公司成立于 2013 年,目前已经在印度、中国、日本、马来西亚、菲律宾、阿拉伯联合酋长国和英国等国家和地区设立了酒店。

面试流程

我在 Oyo Rooms 的 SDE-1 面试中,经历了以下环节:

  1. HR 面:主要了解个人背景和面试相关问题;
  2. 技术面试1:主要测试编程能力,编程语言为 Java;
  3. 技术面试2:主要测试算法和数据结构能力;
  4. 系统设计面试:主要测试系统设计思路和能力。

整个面试过程大约持续了 4 个小时左右。

技术面试1

面试官首先问了一些 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 中的垃圾回收机制。

技术面试2

面试官给了一道经典的算法题: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 提供的多列索引实现了查询功能。

面试官对我的设计进行了一些问答,并补充了一些细节和优化建议。

总结

整个面试过程考察了我的编程能力、算法和数据结构能力、系统设计能力以及英语沟通能力。整体难度较高,但是给予了充分的时间和支持。面试官还提供了很多有价值的反馈和建议,让我受益匪浅。