leetcode
leetcode 1701 ~ 1750
你完成的完整对局数

你完成的完整对局数

难度:

标签:

题目描述

代码结果

运行时间: 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分钟的倍数)。当我们需要将时间向上取整到最近的15分钟倍数时,通常会加上14分钟后再整除15。这是因为整除操作总是取下限(floor),例如:如果开始时间是01分,`1 + 14 = 15`,整除15得到1,即第一个完整的对局从00:15开始。如果开始时间是14分,`14 + 14 = 28`,整除15得到1,下一个对局从00:15开始。这种方法确保了,无论开始时间的分钟数是什么,加14分钟后整除15会正确地向上取整到下一个15分钟的倍数。
🦆
如何确保在使用`(start + 14) // 15`和`finish // 15`公式时,得到的对局数是精确的?
使用`(start + 14) // 15`确保开始时间向上取整到下一个15分钟的倍数,而使用`finish // 15`确保结束时间向下取整到最近的15分钟倍数。这样处理后,计算的对局数是两个时间点之间可能进行的最大完整对局数。例如,如果开始时间是00:01,经`(start + 14) // 15`处理后变为00:15;如果结束时间是00:29,经`finish // 15`处理后变为00:15。这种方式确保了只计算开始和结束时间之间完全包含的15分钟对局,从而使得对局数的计算精确。

相关问题