2024华为OD技术面真题-座位预约管理系统

最近,有多名考友反馈面试时问到了座位预约管理系统这个题目,如果只有一人考到可能是出于偶然,但两人以上都考到这个题目,说明这题的出场率还是挺高的。大家要好好准备下,这道题目本身也不难,临场发挥其实也能做出来。不过要能做到未雨绸缪就更好了。

个人分析,有些面试官喜欢考察设计类题目的原因有以下几点:

  1. 这道题目考察的重点不是算法本身,而更侧重于设计能力,更贴合实际的工作内容。

2.这类题目比较简单,容易实现,对面试者比较友好。

3.更能反应处面试者的真实水平。大多数应聘者都不会去刷这类题目,如果考察力扣hot100之类的题目,很可能不能反应面试者真实水平。

下面回到题目本身,题目要求设计一个座位预约管理系统,具体如下:

题目描述

请你设计一个管理 n 个座位预约的系统,座位编号从 1n

请你实现 SeatManager 类:

  • SeatManager(int n) 初始化一个 SeatManager 对象,它管理从 1n 编号的 n 个座位。所有座位初始都是可预约的。
  • int reserve() 返回可以预约座位的 最小编号 ,此座位变为不可预约。
  • void unreserve(int seatNumber) 将给定编号 seatNumber 对应的座位变成可以预约。
示例 1:
复制代码
输入:
["SeatManager", "reserve", "reserve", "unreserve", "reserve", "reserve", "reserve", "reserve", "unreserve"]
[[5], [], [], [2], [], [], [], [], [5]]
输出:
[null, 1, 2, null, 2, 3, 4, 5, null]

解释:
SeatManager seatManager = new SeatManager(5); // 初始化 SeatManager ,有 5 个座位。
seatManager.reserve();    // 所有座位都可以预约,所以返回最小编号的座位,也就是 1 。
seatManager.reserve();    // 可以预约的座位为 [2,3,4,5] ,返回最小编号的座位,也就是 2 。
seatManager.unreserve(2); // 将座位 2 变为可以预约,现在可预约的座位为 [2,3,4,5] 。
seatManager.reserve();    // 可以预约的座位为 [2,3,4,5] ,返回最小编号的座位,也就是 2 。
seatManager.reserve();    // 可以预约的座位为 [3,4,5] ,返回最小编号的座位,也就是 3 。
seatManager.reserve();    // 可以预约的座位为 [4,5] ,返回最小编号的座位,也就是 4 。
seatManager.reserve();    // 唯一可以预约的是座位 5 ,所以返回 5 。
seatManager.unreserve(5); // 将座位 5 变为可以预约,现在可预约的座位为 [5] 。
提示:
  • 1 <= n <= 105
  • 1 <= seatNumber <= n
  • 每一次对 reserve 的调用,题目保证至少存在一个可以预约的座位。
  • 每一次对 unreserve 的调用,题目保证 seatNumber 在调用函数前都是被预约状态。
  • reserveunreserve 的调用 总共 不超过 105 次。
解题思路

该题目的链接为:1845. 座位预约管理系统 - 力扣(LeetCode)

该题目考察的算法是优先级队列,但如果面试者想不到使用优先级队列,使用暴力方法求解,经过我亲自尝试,通过率也能达到93%,69个用例可以通过64个,有5个用例超时。可见该题目考察重点是设计能力,算法只占一小部分。

优先级队列解法,分大堆顶和小堆顶,c++中priority_queue默认是大堆顶,即队列顶部的元素是最大的。如果要使用小堆顶,需要给priority_queue的第三个参数传入greater<int>,本题即要使用小堆顶。优先级队列会自动对放入其中的数据进行排序,时间复杂度为O(log n)。

代码

暴力解法,通过率93%

cpp 复制代码
class SeatManager {
public:
    int* seat;
    int num;
    SeatManager(int n) {
        seat=new int[n];
        num=n;
        for(int i=0;i<n;i++) {
            seat[i]=0;
        }
    }
    
    int reserve() {
        for(int i=0;i<num;i++) {
            if(seat[i]==0){
                seat[i]=1;
                return i+1;
            }
        }
        return 0;
    }
    
    void unreserve(int seatNumber) {
        if(seatNumber<=0 || seatNumber>num) return;
        seat[seatNumber-1]=0;
    }
};

优先级队列解法,通过率100%

cpp 复制代码
class SeatManager {
public:
    priority_queue<int,vector<int>,greater<int>> que;
    SeatManager(int n) {
        for(int i=1;i<=n;i++) {
            que.push(i);
        }
    }
    
    int reserve() {
        int top=que.top();
        que.pop();
        return top;
    }
    
    void unreserve(int seatNumber) {
        que.push(seatNumber);
    }
};

/**
 * Your SeatManager object will be instantiated and called as such:
 * SeatManager* obj = new SeatManager(n);
 * int param_1 = obj->reserve();
 * obj->unreserve(seatNumber);
 */
相关推荐
得一录19 小时前
AI面试·高难度题
人工智能·面试·职场和发展
programhelp_20 小时前
2026 Adobe面试全流程拆解|OA/VO/Onsite实战指南+高频考点避坑
adobe·面试·职场和发展
晨非辰1 天前
【数据结构入坑指南(三.1)】--《面试必看:单链表与顺序表之争,读懂“不连续”之美背后的算法思想》
数据结构·c++·人工智能·深度学习·算法·机器学习·面试
得一录1 天前
AI面试·简单题
人工智能·面试·职场和发展
小李独爱秋1 天前
模拟面试:什么是微服务架构,它的优缺点是什么?
算法·微服务·面试·职场和发展·框架·架构师
小冷coding1 天前
【面试】面试技巧,自我介绍,技术面试题宝典归纳总结
面试·职场和发展
知识即是力量ol1 天前
口语八股——Spring 面试实战指南(一):核心概念篇、AOP 篇
java·spring·面试·aop·八股·核心概念篇
开开心心_Every1 天前
剪切板工具存500条,可搜索备份导入导出
linux·运维·服务器·华为od·edge·pdf·华为云
知识即是力量ol1 天前
口语八股——Spring 面试实战指南(二):事务管理篇、Spring MVC 篇、Spring Boot 篇、Bean生命周期篇
spring·面试·mvc·springboot·八股·事务管理·bean生命周期
马猴烧酒.1 天前
【面试八股|Spring篇】Spring常见面试题详解笔记
笔记·spring·面试