7-22 老板的作息表
原题:
新浪微博上有人发了某老板的作息时间表,表示其每天 4:30 就起床了。但立刻有眼尖的网友问:这时间表不完整啊,早上九点到下午一点干啥了?
本题就请你编写程序,检查任意一张时间表,找出其中没写出来的时间段。
输入格式:
输入第一行给出一个正整数 N,为作息表上列出的时间段的个数。随后 N 行,每行给出一个时间段,格式为:
hh:mm:ss - hh:mm:ss
其中 hh
、mm
、ss
分别是两位数表示的小时、分钟、秒。第一个时间是开始时间,第二个是结束时间。题目保证所有时间都在一天之内(即从 00:00:00 到 23:59:59);每个区间间隔至少 1 秒;并且任意两个给出的时间区间最多只在一个端点有重合,没有区间重叠的情况。
输出格式:
按照时间顺序列出时间表中没有出现的区间,每个区间占一行,格式与输入相同。题目保证至少存在一个区间需要输出。
.
解题思路:
- 引入
readline
模块并创建接口对象:首先将readline
模块引入,并使用createInterface
方法创建一个接口对象rl
。该对象设置了输入流为标准输入。 - 读取输入并存储:通过监听
'line'
事件,将输入存储在数组buf
中。 - 解析输入并排序:使用
slice
方法将输入数组从索引1开始截取,去掉第一个元素,赋值给变量times
。然后使用sort
方法对times
数组进行升序排列,因为我们需要按时间段的顺序进行处理。 - 初始化变量:将初始变量
start
设置为字符串'00:00:00'
,表示处理的开始时间点,将初始变量res
设置为空字符串,用于存放输出的时间段。 - 处理每个时间段:使用
for of
循环遍历times
数组,将每个时间段赋值给变量i
。使用split
方法将时间段拆分成两个时间,分别赋值给变量begin
和end
。如果begin
大于start
,则说明有缺失的时间段,将该缺失时间段加到结果res
中。更新start
为当前时间段的结束时间end
。 - 处理最后一个时间段:如果最后一个时间段的结束时间
end
小于23:59:59
,则说明最后还有未处理的时间段,将其加入到结果res
中。 - 输出结果:使用
console.log
输出去除首尾空格的结果字符串。
.
JavaScript(node)代码:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
});
let buf = []
rl.on('line', (line) => {
buf.push(line)
})
rl.on('close', () => {
let times = buf.slice(1).sort()
let start = '00:00:00'
let res = ''
for (let i of times) {
let [begin, end] = i.split(' - ')
if (begin > start) {
res += `${
start} - ${
begin}\n`
}
start = end
}
if (start < '23:59:59') {
res += `${
start} - 23:59:59`
}
console.log(res.trim())
});
.