【leetcode】最小时间差

该博客介绍了一个编程问题,即给定一个24小时制时间列表,找到列表中任意两个时间的最小时间差,并以分钟数表示。博主提出了一种解决方案,首先对时间列表排序,然后遍历列表计算相邻时间差及首尾时间差,返回最小值。代码中使用了Java实现,包括时间转换和比较的逻辑。
摘要由CSDN通过智能技术生成
一、题目描述

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

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

二、代码思路

将 timePoints 排序后,最小时间差必然出现在timePoints 的两个相邻时间,或者 timePoints 的两个首尾时间中。因此排序后遍历一遍 timePoints 即可得到最小时间差。

  • 使用collection对list集合进行排序
  • 计算相邻之间的分钟之差(转换成分钟然后计算差)
  • 最后计算首尾分钟之差
  • 取最小
三、代码题解
package leetcode;

import java.util.*;

/*
 * @author lzy
 * @version 1.0
 * */
public class findMinDif_ {
    public static void main(String[] args) {
        findMinDif_ findMinDif1 = new findMinDif_();
        //findMinDif1.timeDifference("23:00", "00:00");
        List<String> list = new ArrayList<>();
        list.add("23:59");
        list.add("00.00");
        System.out.println(findMinDif1.findMinDifference(list));
    }

    public int timeDifference(String str1, String str2, int flag) {
        if (flag == 1) {
            //计算分钟
            int mins1 = Integer.parseInt(str1.substring(3));
            int mins2 = Integer.parseInt(str2.substring(3));
            int hour1 = Integer.parseInt(str1.substring(0, 2));
            int hour2 = Integer.parseInt(str2.substring(0, 2));
            int minDiff = hour1 * 60 + mins1 - hour2 * 60 - mins2;
            return minDiff;
            //整形 + char 会自动转成整形
            //System.out.println(mins1 + " " + mins2);
            //计算小时
        } else {
            return ((str1.charAt(0) - '0') * 10 + (str1.charAt(1) - '0')) * 60 + (str1.charAt(3) - '0') * 10 +
                    (str1.charAt(4) - '0') + 1440 -
                    ((str2.charAt(0) - '0') * 10 + (str2.charAt(1) - '0')) * 60 - (str2.charAt(3) - '0') * 10 -
                    (str2.charAt(4) - '0');
        }
    }

    public int findMinDifference(List<String> timePoints) {
        //初步想法:
        //1、嵌套for循环依次计算两者时间差
        //2、编写一个计算时间差的函数
        Collections.sort(timePoints);
        int point = 1;
        int minMin = 1440;
        int time;
        while (point < timePoints.size()) {
            minMin = ((time = timeDifference(timePoints.get(point), timePoints.get(point - 1),1)) > minMin) ? minMin : time;
            if (minMin == 0) return 0;
            point++;
        }
        return minMin > (time = timeDifference(timePoints.get(0),timePoints.get(timePoints.size() - 1),0)) ? time : minMin;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值