最小时间差(力扣)排序 + 思维 JAVA

该问题涉及编程,要求从一个24小时制的时间列表中找出任意两个时间的最小时间差。解决方案包括对时间点进行排序,然后比较相邻时间的差距,最终返回最小值。如果列表长度超过1440(一天的分钟数),则存在重复时间,最小差值为0。

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

示例 1:

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

示例 2:

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

提示:

2 <= timePoints.length <= 2 * 10^4
timePoints[i] 格式为 “HH:MM”

解题思路:

1、首先应该先知道小时有 0 ~ 23种可能,分钟有0~59种可能也就是说若len > 24 * 60 = 1440的话就说明至少有两个时间是重复的

2、先将线性表排序,由于是string所以会默认按字典序排序

3、最小时差就只可能是相邻两个元素产生或者首位两个元素产生

1:00 ~ 23:00 时间差为:
24 - 23 + 1 = 2 h
排序的意义重大!

代码:

class Solution {
    public int findMinDifference(List<String> timePoints) {
           int len = timePoints.size();
           if(len > 1440) return 0;
           Collections.sort(timePoints);//排序
           int timeFirst =  getMinutes(timePoints.get(0));
           int timeLast = timeFirst;
           int res = Integer.MAX_VALUE;
           for(int i = 1; i < len; i ++) {
        	   int minutes = getMinutes(timePoints.get(i));
        	   res = Math.min(minutes - timeLast, res);
        	   timeLast =  minutes;
           }
           return res = Math.min(res, 1440 - timeLast + timeFirst);
    }
    
    public int getMinutes(String s) {
    	String a[] = s.split(":");
    	return Integer.parseInt(a[0]) * 60 + Integer.parseInt(a[1]);
    }
}

在这里插入图片描述

### 力扣第67题的C++实现 力扣第67题名为“二进制求”,其目标是给定两个二进制字符串 `a` `b`,返回它们相加后的结果作为新的二进制字符串。以下是该问题的一个高效 C++ 实现方案: 此方法通过模拟手动计算二进制数的方式完成操作。具体而言,它从最低位开始逐位处理两数之,并记录可能产生的进位情况。 ```cpp #include <string> using namespace std; string addBinary(string a, string b) { int len_a = a.length(); int len_b = b.length(); string result; int temp; int jinwei = 0; // 进位标志 int i = 0, j = 0; while (len_a || len_b) { // 当任意一个字符串还有未处理的部分时继续循环 temp = 0; if (len_a) { // 如果第一个字符串仍有剩余部分,则加入当前位到临时变量中 temp += (a[len_a - 1] - '0'); len_a--; } if (len_b) { // 同理对于第二个字符串也做相同的操作 temp += (b[len_b - 1] - '0'); len_b--; } temp += jinwei; // 加上之前的进位值 result.insert(0, 1, (temp % 2) + '0'); // 将当前位的结果插入到结果字符串开头 jinwei = temp / 2; // 更新进位状态 } if (jinwei == 1) { // 若最后还存在进位,则需额外补充一位‘1’ result.insert(0, 1, '1'); } return result; // 返回最终结果 } ``` 上述代码实现了完整的逻辑来解决二进制求的问题[^2]。其中核心在于如何正确处理每一位上的数值以及可能出现的进位现象。 #### 关键点解析 - **双指针遍历**:分别指向输入字符串 `a` `b` 的末尾位置,逐步向前移动直至两者被完全扫描。 - **模运算取余**:利用 `(temp % 2)` 来获取当前位的实际值(即考虑进位的情况下),并将其转换回字符形式追加至结果串前部。 - **整除判断进位**:`(temp / 2)` 可得出是否有向更高位传递的必要;若有则设置相应的标记供下一轮迭代使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值