给定一个 24 小时制(小时:分钟 “HH:MM“)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。

给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。

示例 1:

 输入:timePoints = ["23:59","00:00"]
 输出:1

示例 2:

 输入:timePoints = ["00:00","23:59","00:00"]
 输出:0

解题思路:

1.将时间转化为分钟数,进行升序排列;
2.遍历时间数组,将相邻差值组成一个新的 差值数组;
3.用最后一项减去第一项,并添加到差值数组;
4.将差值数组进行升序排列;
5.返回第一项,即为最小时间差;

代码

/**
 * @param {string[]} timePoints
 * @return {number}
 */
var findMinDifference = function(timePoints) {

    if(!Array.isArray(timePoints)) return
    const timeArray = timePoints.map((item)=>{
		return item = parseInt(item.substr(0,2)) * 60 + parseInt(item.substr(3,2))
    }).sort((a,b)=>{return a-b})
    
	let numList = []
	timeArray.forEach((item,i)=>{
		if(i>0){
			numList.push(Math.min(Math.abs(timeArray[i] - timeArray[i-1]),1440-Math.abs(timeArray[i] - timeArray[i-1])))
		}
	})
	
	const lastChild = Math.abs(timeArray[timeArray.length-1] - timeArray[0])
	numList.push(Math.min(lastChild,1440-lastChild))
	
	numList.sort((a,b)=>{return a-b})
	
	return numList[0]
};
// let data = ["00:00","04:00","22:00"]
let data = ["23:59","00:00"]
findMinDifference(data )

建议进行性能测试

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以通过以下步骤实现: 1. 将时间列表转换为开始时间和结束时间列表,即将 "hh:mm-hh:mm" 格式的字符串转换为两个 LocalTime 对象。 2. 计算给定分钟对应的时间量,例如 90 分钟等于 1 小时 30 分钟。 3. 获取当前日期和时间的 LocalDateTime 对象。 4. 判断当前时间是否处于工作时段内,如果不是,则将当前时间设置为当天的工作开始时间。 5. 循环遍历工作时段列表,找到下一个可用的时间段,即开始时间在当前时间之后且结束时间在当前时间加上给定分钟之后。 6. 如果找到可用的时间段,则将当前时间设置为该时间段的开始时间加上给定分钟时间,然后退出循环。 7. 如果没有找到可用的时间段,则将当前时间设置为当天的工作开始时间加上给定分钟时间,并将日期加一天。 8. 返回计算后的日期时间。 下面是 Java 代码示例: ```java import java.time.*; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class DateTimeUtils { private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern("HH:mm"); /** * 计算给定分钟后的日期时间 * * @param minutes 给定分钟 * @param workTimeList 工作时间列表,格式为 "hh:mm-hh:mm" * @return 计算后的日期时间 */ public static LocalDateTime calculateDateTimeAfterMinutes(int minutes, List<String> workTimeList) { // 将时间列表转换为开始时间和结束时间列表 List<LocalTime> startTimeList = workTimeList.stream().map(s -> s.split("-")[0]).map(LocalTime::parse).collect(Collectors.toList()); List<LocalTime> endTimeList = workTimeList.stream().map(s -> s.split("-")[1]).map(LocalTime::parse).collect(Collectors.toList()); // 计算给定分钟对应的时间量 Duration duration = Duration.ofMinutes(minutes); // 获取当前日期和时间的 LocalDateTime 对象 LocalDateTime now = LocalDateTime.now(); // 判断当前时间是否处于工作时段内,如果不是,则将当前时间设置为当天的工作开始时间 boolean isInWorkTime = false; for (int i = 0; i < startTimeList.size(); i++) { if (now.toLocalTime().isBefore(startTimeList.get(i))) { now = LocalDateTime.of(now.toLocalDate(), startTimeList.get(i)); isInWorkTime = true; break; } else if (now.toLocalTime().isAfter(startTimeList.get(i)) && now.toLocalTime().isBefore(endTimeList.get(i))) { isInWorkTime = true; break; } } if (!isInWorkTime) { now = LocalDateTime.of(now.toLocalDate(), startTimeList.get(0)); } // 循环遍历工作时段列表,找到下一个可用的时间段 boolean found = false; for (int i = 0; i < startTimeList.size(); i++) { if (startTimeList.get(i).isAfter(now.toLocalTime())) { LocalDateTime start = LocalDateTime.of(now.toLocalDate(), startTimeList.get(i)); LocalDateTime end = LocalDateTime.of(now.toLocalDate(), endTimeList.get(i)); if (start.plus(duration).isBefore(end)) { now = start.plus(duration); found = true; break; } } } // 如果没有找到可用的时间段,则将当前时间设置为当天的工作开始时间加上给定分钟时间,并将日期加一天 if (!found) { now = LocalDateTime.of(now.toLocalDate().plusDays(1), startTimeList.get(0)).plus(duration); } return now; } public static void main(String[] args) { // 测试代码 List<String> workTimeList = Stream.of("09:00-12:00", "13:00-18:00").collect(Collectors.toList()); LocalDateTime dateTime = calculateDateTimeAfterMinutes(90, workTimeList); String formattedDateTime = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println(formattedDateTime); // 输出示例:2021-10-01 10:30:00 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xie_bro777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值