你完成的完整对局数
难度:
标签:
题目描述
代码结果
运行时间: 22 ms, 内存: 16.1 MB
/*
思路:
1. 将 startTime 和 finishTime 转换为分钟数。
2. 处理跨越午夜的情况。
3. 计算从开始时间到结束时间的完整对局数。
4. 使用 Java Stream 简化代码。
*/
import java.util.stream.IntStream;
public class Solution {
public int numberOfRounds(String startTime, String finishTime) {
int startMinutes = convertToMinutes(startTime);
int finishMinutes = convertToMinutes(finishTime);
if (finishMinutes < startMinutes) {
finishMinutes += 24 * 60; // 处理通宵的情况
}
return (int) IntStream.rangeClosed((startMinutes + 14) / 15, finishMinutes / 15).count() - 1;
}
private int convertToMinutes(String time) {
String[] parts = time.split(":");
int hours = Integer.parseInt(parts[0]);
int minutes = Integer.parseInt(parts[1]);
return hours * 60 + minutes;
}
}
解释
方法:
首先,将输入时间转换为从当天零点开始计算的分钟数。这样,开始时间和结束时间可以转换为整数,便于计算。如果结束时间小于开始时间,表示玩家玩了一个通宵,因此需要给结束时间加上一天的分钟数(24 * 60)。为了计算完整的对局数,开始时间需要向上取整到最近的一个对局开始时间(即15分钟的倍数),而结束时间需要向下取整。计算这两个时间点之间的完整对局数,即可得到结果。如果计算出来的对局数是负数,则返回0。
时间复杂度:
O(1)
空间复杂度:
O(1)
代码细节讲解
🦆
算法中`start + 14`的用途是什么?为什么选择加14而不是其他数字?
▷🦆
如何确保在使用`(start + 14) // 15`和`finish // 15`公式时,得到的对局数是精确的?
▷