Leetcode打卡:考场就坐

执行结果:通过

题目: 855 考场就坐

在考场里,有 n 个座位排成一行,编号为 0 到 n - 1

当学生进入考场后,他必须坐在离最近的人最远的座位上。如果有多个这样的座位,他会坐在编号最小的座位上。(另外,如果考场里没有人,那么学生就坐在 0 号座位上。)

设计一个模拟所述考场的类。

实现 ExamRoom 类:

  • ExamRoom(int n) 用座位的数量 n 初始化考场对象。
  • int seat() 返回下一个学生将会入座的座位编号。
  • void leave(int p) 指定坐在座位 p 的学生将离开教室。保证座位 p 上会有一位学生。

示例 1:

输入:
["ExamRoom", "seat", "seat", "seat", "seat", "leave", "seat"]
[[10], [], [], [], [], [4], []]
输出:
[null, 0, 9, 4, 2, null, 5]
解释:
ExamRoom examRoom = new ExamRoom(10);
examRoom.seat(); // 返回 0,房间里没有人,学生坐在 0 号座位。
examRoom.seat(); // 返回 9,学生最后坐在 9 号座位。
examRoom.seat(); // 返回 4,学生最后坐在 4 号座位。
examRoom.seat(); // 返回 2,学生最后坐在 2 号座位。
examRoom.leave(4);
examRoom.seat(); // 返回 5,学生最后坐在 5 号座位。

提示:

  1. 1 <= n <= 109
  2. 保证有学生正坐在座位 p 上。
  3. seat 和 leave 最多被调用 104 次。

代码以及解题思路

代码:

typedef struct mylink {
    int id;
    struct mylink *next;
} mylink;


typedef struct {
    int length;
    mylink* root;
} ExamRoom;
void print_obj(ExamRoom *obj)
{
    printf("%d ",obj->length);
    mylink* tmp=obj->root;
    while(tmp!=NULL)
    {
        printf("%d ",tmp->id);
        tmp=tmp->next;
    }
    printf("\n");
}


ExamRoom* examRoomCreate(int n) {
     ExamRoom* obj=malloc(sizeof(ExamRoom));
    obj->length=n;
    obj->root=NULL;
    return obj;

}

int examRoomSeat(ExamRoom* obj) {
    if(obj->root==NULL)
    {
        obj->root=malloc(sizeof(mylink));
        obj->root->id=0;
        obj->root->next=NULL;
        return 0;
    }
    int max=-1;
    if(obj->root->id!=0) max=obj->root->id;
    mylink* max_link_before=NULL;
    mylink* tmp=obj->root;
    int diff=0;
    while(tmp->next!=NULL)
    {   
        diff=(tmp->next->id - tmp->id)/2;
        if(diff>max)
        {
            max=diff;
            max_link_before=tmp;
        }
        tmp=tmp->next;
    }
    //tmp 为末尾时
    diff=obj->length -1 - tmp->id;
    if(diff>max)
    {
        max=diff;
        max_link_before=tmp;
    }
    if(max_link_before==NULL)
    {
        mylink* add=malloc(sizeof(mylink));
        add->id=0;
        add->next=obj->root;
        obj->root=add;
        return 0;
    }
    if(max_link_before->next==NULL)
    {
        max_link_before->next=malloc(sizeof(mylink));
        max_link_before->next->id=obj->length-1;
        max_link_before->next->next=NULL;
        return obj->length-1;
    }
    else
    {
        mylink* add=malloc(sizeof(mylink));
        add->id=max_link_before->id + max;
        add->next=max_link_before->next;
        max_link_before->next=add;
        return add->id;
    }

}

void examRoomLeave(ExamRoom* obj, int p) {
     mylink* tmp=obj->root;
    mylink* before=NULL;
    while(tmp!=NULL)
    {
        if(tmp->id==p)
        {
            if(before==NULL)
            {
                obj->root=tmp->next;
                free(tmp);
            }
            else
            {
                before->next=tmp->next;

                free(tmp);
            }
            return;
        }
        before=tmp;
        tmp=tmp->next;
    }

}

void examRoomFree(ExamRoom* obj) {
    mylink* tmp=obj->root;
    mylink* next;
    while(tmp!=NULL)
    {
        next=tmp->next;
        free(tmp);
        tmp=next;
    }
    free(obj);

}

解题思路:

1. 数据结构定义

  • mylink 结构体:表示链表中的一个节点,包含座位号 id 和指向下一个节点的指针 next
  • ExamRoom 结构体:表示考场,包含两个成员:length 表示考场总座位数,root 指向链表的头节点。

2. print_obj 函数

  • 作用:打印考场信息,包括总座位数和已分配的座位号。
  • 解题思路:首先打印总座位数 length,然后遍历链表,打印每个节点的座位号 id

3. examRoomCreate 函数

  • 作用:创建一个新的考场对象。
  • 解题思路:使用 malloc 分配 ExamRoom 结构体所需的内存,初始化 length 为传入的参数 nroot 初始化为 NULL(表示链表为空),最后返回创建的考场对象。

4. examRoomSeat 函数

  • 作用:在考场中分配一个座位,并返回分配的座位号。
  • 解题思路
    1. 如果链表为空(即还没有分配任何座位),则在链表头部插入一个座位号为 0 的节点,并返回 0
    2. 遍历链表,计算相邻座位之间的最大间距 max 和该间距前的节点 max_link_before
    3. 考虑链表末尾与最后一个座位之间的间距。
    4. 根据 max_link_before 的值,在最大间距处插入一个新节点:
      • 如果 max_link_before 为 NULL,则在链表头部插入新节点。
      • 如果 max_link_before->next 为 NULL,则在链表尾部插入新节点。
      • 否则,在 max_link_before 和 max_link_before->next 之间插入新节点。
    5. 新节点的座位号 id 为 max_link_before->id + max,然后返回新节点的座位号。

5. examRoomLeave 函数

  • 作用:释放一个座位。
  • 解题思路:遍历链表,找到座位号为 p 的节点,并将其从链表中删除。如果要删除的节点是头节点,则更新头节点为下一个节点;否则,更新前一个节点的 next 指针,跳过要删除的节点。最后释放要删除的节点的内存。

6. examRoomFree 函数

  • 作用:释放考场对象及其占用的所有内存。
  • 解题思路:遍历链表,释放每个节点的内存,然后释放考场对象本身的内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/941532.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024.2 ACM Explainability for Large Language Models: A Survey

Explainability for Large Language Models: A Survey | ACM Transactions on Intelligent Systems and Technology 问题 可解释性问题&#xff1a;大语言模型&#xff08;LLMs&#xff09;内部机制不透明&#xff0c;难以理解其决策过程&#xff0c;如在自然语言处理任务中&…

解决“SVN无法上传或下载*.so、*.a等二进制文件“问题

今天&#xff0c;在使用Subversion提交代码到服务器时&#xff0c;发现无法提交*.a、*.so等二进制文件&#xff0c;右击这些文件&#xff0c;发现其属性为ignores。     问题原因&#xff1a;SVN的配置文件里&#xff0c;屏蔽了*.a、*.so文件的上传与下载&#xff0c;并把这些…

层序遍历练习

层次遍历 II 给定一个二叉树&#xff0c;返回其节点值自底向上的层次遍历。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 思路 相对于102.二叉树的层序遍历&#xff0c;就是最后把result数组反转一下就可以了。 C代码&…

京东大数据治理探索与实践 | 京东零售技术实践

01背景和方案 在当今的数据驱动时代&#xff0c;数据作为关键生产要素之一&#xff0c;其在商业活动中的战略价值愈加凸显&#xff0c;京东也不例外。 作为国内领先的电商平台&#xff0c;京东在数据基础设施上的投入极为巨大&#xff0c;涵盖数万台服务器、数 EB 级存储、数百…

【论文阅读笔记】Learning to sample

Learning to sample 前沿引言方法问题声明S-NET匹配ProgressiveNet: sampling as ordering 实验分类检索重建 结论附录 前沿 这是一篇比较经典的基于深度学习的点云下采样方法 核心创新点&#xff1a; 首次提出了一种学习驱动的、任务特定的点云采样方法引入了两种采样网络&…

[AIGC知识] layout理解

前言 要开组会了&#xff0c;随便讲个凑数吧。 参考论文 https://arxiv.org/html/2303.17189? 什么是layout数据&#xff1f; 像下图这样&#xff0c;Layout是每个图片的布局&#xff0c;其中包含一些物体的相应边界框和类别 layout信息如何整合表示并作为条件加入到网络…

【macos java反编译工具Java Decompiler】

mac上能用的反编译工具 https://java-decompiler.github.io/

C#+OpenCv深度学习开发(常用模型汇总)

在使用 OpenCvSharp 结合深度学习进行机器视觉开发时&#xff0c;有许多现成的模型可以使用。以下是一些常用的深度学习模型&#xff0c;适用于不同的机器视觉任务&#xff0c;包括物体检测、图像分类和分割等。 使用示例 在 OpenCvSharp 中加载和使用这些模型的基本示例&…

【生成模型之七】Classifier-free diffusion guidance

论文&#xff1a;classifier-free diffusion guidance 一、Background 分类器引导是一种最近引入的方法&#xff0c;用于在训练后的条件扩散模型中权衡样本丰富度和样本保真度&#xff0c;其思想与其他类型生成模型中的低温采样或截断相同。 分类器引导将扩散模型的分数估计…

【LeetCode每日一题】——415.字符串相加

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 字符串 二【题目难度】 简单 三【题目编号】 415.字符串相加 四【题目描述】 给定两个字符…

Why SAP TM?

最近发现跟 SAP TM 的集成越来越多了&#xff0c;并且发现这模块还挺大&#xff0c;很难一下子理解。TM&#xff08;Transportation Management&#xff09;- 顾名思义就是“运输管理”。起初很难想象为啥 SAP 会浪费大量的时间和精力开发“运输管理”&#xff0c;从而只是为了…

开源鸿蒙 5.0 正式版发布

在2024年的开放原子开发者大会上&#xff0c;开源鸿蒙5.0版本正式发布啦&#xff01;这个版本是一个比较大的升级&#xff0c;性能和功能都上了一个新台阶&#xff0c;让我们一起来看看都有哪些亮点。 首先&#xff0c;开源鸿蒙这个项目&#xff0c;从最初的700万行代码&#x…

直流有刷电机多环控制(PID闭环死区和积分分离)

直流有刷电机多环控制 提高部分-第8讲 直流有刷电机多环控制实现(1)_哔哩哔哩_bilibili PID模型 外环的输出作为内环的输入&#xff0c;外环是最主要控制的效果&#xff0c;主要控制电机的位置。改变位置可以改变速度&#xff0c;改变速度是受电流控制。 实验环境 【 &…

Odrive源码分析(四) 位置爬坡算法

Odrive中自带一个简单的梯形速度爬坡算法&#xff0c;本文分析下这部分代码。 代码如下&#xff1a; #include <cmath> #include "odrive_main.h" #include "utils.hpp"// A sign function where input 0 has positive sign (not 0) float sign_ha…

电视大全 1.3.8|汇聚多频道资源,秒切换流畅播放

电视大全TV版是一款功能丰富的TV端直播软件&#xff0c;由悠兔电视的同一开发者打造。最新版本更新了更多频道&#xff0c;包括央视、卫视和地方频道等&#xff0c;提供了多线路流畅播放体验&#xff0c;并支持节目回看、线路选择、开机自启等功能。该应用免登录且无购物频道&a…

JAVAweb学习日记(二)JavaScript

一、概念 二、JavaScript引入方式 三、JavaScript书写语法 输出语句&#xff1a; 变量&#xff1a; 数据类型、运算符、流程控制语句&#xff1a; 数据类型&#xff1a; 运算符&#xff1a; 字符串如果是 数字字符构成&#xff0c;先把读到的数字转为数字类型&#xff0c;后续…

深圳龙岗戴尔dell r730xd服务器故障维修

深圳龙岗一台DELL POWEREDGE R730XD服务器系统故障问题处理&#xff1a; 1&#xff1a;客户工厂年底产线整改&#xff0c;时不时的会意外断电&#xff0c;导致服务器也频繁停机&#xff0c; 2&#xff1a;多次异常停机后导致服务器开机后windows server系统无法正常启动了&…

Ansible 批量管理华为 CE 交换机

注&#xff1a;本文为 “Ansible 管理华为 CE 交换机” 相关文章合辑。 使用 CloudEngine - Ansible 批量管理华为 CE 交换机 wsf535 IP 属地&#xff1a;贵州 2018.02.05 15:26:05 总体介绍 Ansible 是一个开源的自动化运维工具&#xff0c;AnsibleWorks 成立于 2012 年&a…

2024年Python最新下载安装教程,附详细图文,持续更新

大家好&#xff0c;我是Python老安&#xff0c;今天为大家带来的是Windows Python3下载、安装教程&#xff0c;适用于 Python3 所有版本&#xff0c;包括 Python3.7,Python33.8,Python33.10 等版本。希望对大家有所帮助 Python目前已支持所有主流操作系统&#xff0c;在Linux,…

《点点之歌》“意外”诞生记

世界是“点点”的&#xff0c;“点点”是世界的。 (笔记模板由python脚本于2024年12月23日 19:28:25创建&#xff0c;本篇笔记适合喜欢诗文的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 …