全球焦点!地铁闸机题:地铁闸机上一秒没有被使用怎么办?
第二题 地铁闸机
(资料图)
某地铁站有一个闸机,同一时刻只允许一名乘客进站或出站,一个乘客通过闸机需要 1 秒钟。
如果在同一时刻,一个乘客要进站,另一个乘客要出站,按如下规则进出站:
l 如果上一秒,闸机没有被使用(即使更早被使用过),那么进站的乘客优先通过;
l 如果上一秒,闸机有乘客进站,那么进站的乘客优先;
l 如果上一秒,闸机有乘客出站,那么出站的乘客优先。
现有一群乘客要通过这个闸机,乘客的到达时刻记录于数组 arrTime 中(升序,可能有重复值),下标表示乘客的编号;乘客的进出站方向记录于direction中(0 表示出站,1 表示进站)。
请按乘客的编号顺序依次返回每个乘客实际通过闸机的时刻。
注意:若多人同时进站,按 arrTime 中下标从小到大顺序通过闸机;若多人同时出站,也按此处理。
Ø 示例 1:
输入:
arrTime = [0,0,1,5]
direction = [0,1,1,0]
输出:[2,0,1,5]
解释:
在 0 时刻,乘客 0(出站)和 1(进站)想要通过闸机。由于闸机上一秒没有被使用,所以乘客 1 优先进站,乘客 0 等待下一时刻;
在 1 时刻,乘客 2(进站)到达闸机,和乘客 0(出站)都要通过闸机。由于上一秒闸机有乘客进站,所以乘客 2 优先进站,乘客 0 继续等待下一时刻;
在 2 时刻,乘客 0 通过闸机;
在 5 时刻,乘客 3 通过闸机。
Ø 示例 2:
输入:
arrTime = [2,2,2,2,3,3,5,5,20,20]
direction = [0,1,1,0,0,1,1,0,0,1]
输出:[6,2,3,7,8,4,5,9,21,20]
解释:
在 2 时刻,乘客 0 和 3 同时出站,乘客 1 和 2 同时进站。由于闸机上一秒没有被使用,进站优先,且下标小的乘客 1 优先通过闸机;
在 20 时刻,乘客 8 要出站,乘客 9 要进站。由于闸机上一秒没有被使用(之前被使用过),所以乘客 9 优先通过闸机。
提示:
l 0 < arrTime.length == direction.length <= 10^5,arrTime[i] 和 direction[i] 分别表示第 i 个乘客的到达时刻和进出站方向
l 0 <= arrTime[i] <= arrTime[i+1] < 10^9
l direction[i] 仅为 0 或 1
答题要求:您编写的代码需要符合 CleanCode 的要求(包括通用编码规范、安全编码规范和圈复杂度)。
这道题看上去没有啥特别的算法,就是直译,条件判断稍麻烦,圈复杂度容易超出。
#include#include#includeusing namespace std;class Solution {public: bool canIn(queue&otherQueue, int machineState, int ticktime, pair&theOther) const { bool shouldPass = false; if (machineState == 0 || machineState == 1) { shouldPass = true; } if (machineState == -1) { if (otherQueue.size() > 0) { theOther = otherQueue.front(); if (theOther.second > ticktime) { shouldPass = true; } } if (otherQueue.size() == 0) { shouldPass = true; } } return shouldPass; } bool canOut(queue&inQueue, int machineState, int ticktime, const pair&currOut, pair&currIn) const { bool shouldPass = false; if (currOut.second <= 0="" if="" machinestate="=" shouldpass="true;"> 0) { currIn = inQueue.front(); if (currIn.second > ticktime) { shouldPass = true; } } if (inQueue.size() == 0) { shouldPass = true; } } } return shouldPass; } vectorCalcInOutTime(vectorarrTimes, vectordirections) { int size = arrTimes.size(); vectorresult(size); // 拆分为出站和进站两个队列 queueinQueue; queueoutQueue; for (int i = 0; i < directions.size(); ++i) { if (directions[i] == 1) { inQueue.push({i, arrTimes[i]}); } else { outQueue.push({i, arrTimes[i]}); } } // 以闸机视角处理 int machineState = 0; // 上一秒的状态,默认为空闲 int ticktime = arrTimes[0]; bool shouldPass = false; // 当前是否可以通过 paircurrIn; paircurrOut; while (ticktime < arrTimes[size - 1] + size) { shouldPass = false; // 进一人 if (inQueue.size() > 0) { currIn = inQueue.front(); if (currIn.second <= shouldpass="" if="" machinestate="0;" else=""> 0) { currOut = outQueue.front(); shouldPass = canOut(inQueue, machineState, ticktime, currOut, currIn); if (shouldPass) { result[currOut.first] = ticktime; outQueue.pop(); machineState = -1; // 出站 } else { machineState = 0; // 空闲 } } // 不过人 ticktime++; } return result; }};
测试用例如下:
TEST(SubwayTestSuite, Test1) { Solution s; vectorarrTimes = {2, 2, 2, 2, 3, 3, 5, 5, 20, 20}; vectordirections = {0, 1, 1, 0, 0, 1, 1, 0, 0, 1}; vectorresult = s.CalcInOutTime(arrTimes, directions); vectorexpected = {6, 2, 3, 7, 8, 4, 5, 9, 21, 20}; for (int i = 0; i < expected.size(); ++i) { ASSERT_EQ(expected[i], result[i]); }}TEST(SubwayTestSuite, Test2) { Solution s; vectorarrTimes = {0, 0, 1, 5}; vectordirections = {0, 1, 1, 0}; vectorresult = s.CalcInOutTime(arrTimes, directions); vectorexpected = {2, 0, 1, 5}; for (int i = 0; i < expected.size(); ++i) { ASSERT_EQ(expected[i], result[i]); }}
标签:
相关推荐:
最新新闻:
- 如何判别一个MT4软件是否是盗版?辨别技巧_当前热门
- 大数据常用基本算法 双冒泡排序双向冒泡算法的原理及应用_今日热议
- 焦点播报:十款实用方便的日志分析工具 建议收藏
- 【win10】HPLaserJetP1106的驱动和打印测试_今头条
- 教你怎样反蹭网?如何隐藏你的无线网络?|热点评
- gcc-3.4-ubuntu12.04怎么安装?gcc-3.4-ubuntu12.04安装教程|环球信息
- 软件设计文档编写用例——Android手机端测试 全球播资讯
- 世界播报:excel下拉菜单怎么做?excel系列软件最新版本下载
- 每日观察!ps图层蒙版怎么使用?ps图层蒙版使用步骤
- 海康威视硬盘录像机报价是多少?海康威视硬盘录像机报价及功能介绍
- 智课雅思词汇——二十三、名词性后缀mony|当前信息
- excel高级筛选怎么用?excel高级的用法步骤 全球热文
- 穿越火线:nsiserror怎么解决?重新下载再安装
- 【数据项列表】DataMember的属性及使用方法
- 手机音乐播放器哪个好?常用的手机播放器有哪些? 焦点热讯
- prisma怎么用?Prisma有没电脑版?
- 一个手机号可以注册两个微信账号吗?注册流程是什么?
- 迅雷登录不了出现登录超时如何解决?出现登录超时的详细解决步骤
- iPhone 14黄色版本周发布:5399价格不变:最资讯
- 天天微头条丨android休眠唤醒机制分析(二):Android休眠流程
- hexagon净水器好不好?hexagon净水器产品优点介绍-世界快报
- 雷石新发布惊艳6000机顶盒、云盘监测器等软硬件产品
- Word中的表格如何调整?Word表格调整技巧 每日视点
- IntelMac能够运行OSX和XP吗?详情介绍 天天资讯
- Word怎么设置图片透明度?Word设置图片透明度小技巧-世界简讯
- 佳能A系列相机使用指南 佳能A系列相机CCD坏点的检验方法|天天报资讯
- 天天热门:华为荣耀4C什么配置参数?华为荣耀4C标配有什么?
- 全球焦点!地铁闸机题:地铁闸机上一秒没有被使用怎么办?
- 要闻速递:28英寸4K+144Hz显示器到手仅1999元
- usb3.0不能用怎么办?usb3.0不能使用的解决办法_天天快资讯
- 环球实时:Myeclipse10破解工具及方法图解(附下载)
- 世界实时:虚拟机怎么安装?vmware虚拟机安装教程
- 百度快照是什么?百度快照的相关内容介绍:全球微头条
- XP如何升级Win10?360免费升级正版win10教程:热头条
- iPhone SE 4今年发布:全面屏幕 很像Xr:焦点热文
- 当前关注:word中如何设置文本的首行缩进?word文本首行缩进设置方法
- 手机系统怎么升级?刷机有风险吗?
- 环球焦点!电脑功耗等于电源瓦数吗?菜鸟进阶篇之电脑功耗测算方法
- 佳能a800相机价格是多少?佳能a800相机价格及评测
- 热消息:全球最权威的学术期刊之一——《科学》
- 世界播报:抽象是什么?为什么学Java会遇到抽象?
- AMCAP程序详解:AMCeGraphBuilder
- 环球观察:UCB1策略和公式的理解 解决探索与利用平衡问题
- Mockplus:简洁高效的原型设计工具 轻松入门-环球快看
- iPhone 15屏幕曝光:灵动岛挖孔屏 但还是60Hz 环球速看
- java的序列化机制是什么?java序列化ID的作用:世界热闻
- rolling(k)函数的用法详解 例子说明rolling函数的用法
- 天天时讯:cdn加速测试:又拍云每个月免费提供15g流量
- 当前头条:堆与栈有什么区别?堆与栈的区别详细总结
- 什么是数据库索引?MySQL官方对索引的定义及索引优劣势分析:每日速读
- 英国女子号称“现实版睡美人” 每天昏睡22小时
- 2023年2月PS5在英国的销量暴涨316%
- 环球速递!《神领编年史》新更新上线 SE移除D加密技术
- 全球消息!《死亡细胞》重返恶魔城DLC发布上市预告
- Arkane确认所有版本《红霞岛》支持跨平台联机
- 北京最新天气预报:今天最高气温19℃,大气扩散条件和能见度较差
- 索尼克之父中裕司认罪!承认内幕交易
- 天天微头条丨只能用功能机 司法部要求FTX创始人保释期间不能用智能手机
- 续航50短通勤 五星钻豹电动车1299元:全球热头条
- 环球视讯!微软Win11开始重新设计混音器
- 太便宜了!精粤B760M主板仅需399元
- 人民币是什么材料做的|即时看
- 全球讯息:《破坏领主》3月15日登陆主机 Endgame更新同时发布
- 《最终幻想16》不是基于夜光或虚幻引擎运行
- 《宝可梦:朱/紫》1.2更新后部分玩家存档被删除:环球要闻
- Wii U用户重创:任天堂下架马里奥赛车和斯普拉遁
- 烧白做法_烧白如何做
- 国外团队开发出突破性隐形眼镜 可防干眼症 速递
- 热消息:《忍者神龟:变种大乱斗》首曝中字预告 “龟”来依旧是少年
- 红楼梦十二金钗判词|环球热闻
- 当前热讯:男子用微缩模型还原高启强老家:做了11天 约400个配件
- 戴尔推出AW620M无线鼠标 DPI最高26000
- 焦点热议:百威亚太(01876):高端啤酒龙头国内市场“遇冷记”
- 外媒锐评《自杀小队》服务模式:都想学《命运》?
- 《古墓丽影》重启作发售10周年纪念 官方发文庆贺 新视野