天天看點

1904. 你完成的完整對局數題目:java代碼:

題目:

一款新的線上電子遊戲在近期釋出,在該電子遊戲中,以 刻鐘 為周期規劃若幹時長為 15 分鐘 的遊戲對局。這意味着,在 HH:00、HH:15、HH:30 和 HH:45 ,将會開始一個新的對局,其中 HH 用一個從 00 到 23 的整數表示。遊戲中使用 24 小時制的時鐘 ,是以一天中最早的時間是 00:00 ,最晚的時間是 23:59 。

給你兩個字元串 startTime 和 finishTime ,均符合 “HH:MM” 格式,分别表示你 進入 和 退出 遊戲的确切時間,請計算在整個遊戲會話期間,你完成的 完整對局的對局數 。

例如,如果 startTime = “05:20” 且 finishTime = “05:59” ,這意味着你僅僅完成從 05:30 到 05:45 這一個完整對局。而你沒有完成從 05:15 到 05:30 的完整對局,因為你是在對局開始後進入的遊戲;同時,你也沒有完成從 05:45 到 06:00 的完整對局,因為你是在對局結束前退出的遊戲。

如果 finishTime 早于 startTime ,這表示你玩了個通宵(也就是從 startTime 到午夜,再從午夜到 finishTime)。

假設你是從 startTime 進入遊戲,并在 finishTime 退出遊戲,請計算并傳回你完成的 完整對局的對局數 。

示例 1:

輸入:startTime = “12:01”, finishTime = “12:44”

輸出:1

解釋:你完成了從 12:15 到 12:30 的一個完整對局。

你沒有完成從 12:00 到 12:15 的完整對局,因為你是在對局開始後的 12:01 進入的遊戲。

你沒有完成從 12:30 到 12:45 的完整對局,因為你是在對局結束前的 12:44 退出的遊戲。

示例 2:

輸入:startTime = “20:00”, finishTime = “06:00”

輸出:40

解釋:你完成了從 20:00 到 00:00 的 16 個完整的對局,以及從 00:00 到 06:00 的 24 個完整的對局。

16 + 24 = 40

示例 3:

輸入:startTime = “00:00”, finishTime = “23:59”

輸出:95

解釋:除最後一個小時你隻完成了 3 個完整對局外,其餘每個小時均完成了 4 場完整對局。

提示:

startTime 和 finishTime 的格式為 HH:MM

00 <= HH <= 23

00 <= MM <= 59

startTime 和 finishTime 不相等

java代碼:

class Solution {
	public int numberOfRounds(String loginTime, String logoutTime) {
		int[] login = this.time(loginTime);
		int[] logout = this.time(logoutTime);
		this.ceiling(login);// 最近大,調整到最近一個開始的起點,順時針調整時間
		this.floor(logout);// 最近小,調整到最近一個結束的終點,逆時針調整時間
		if (loginTime.compareTo(logoutTime) < 0) {
			// 同一天
			return Math.max(round24(login) - round24(logout), 0);//wa2
		} else {
			// 不同天
			return round24(login) + round00(logout);
		}
	}

	// 玩到0點能玩幾局
	private int round24(int[] time) {
		return ((23 - time[0]) << 2) + this.round(time[1]);
	}

	// 從0點玩能玩幾局
	private int round00(int[] time) {
		return (time[0] << 2) + 4 - this.round(time[1]);
	}

	// 玩到下一個整點能玩幾局
	private int round(int minute) {
		if (minute == 0) {
			return 4;
		}
		if (minute == 15) {
			return 3;
		}
		if (minute == 30) {
			return 2;
		}
		return 1;
	}

	// 最近小
	private void floor(int[] time) {
		int minute = time[1];
		if (minute == 0 || minute == 15 || minute == 30 || minute == 45) {
			return;
		}
		if (minute < 15) {
			time[1] = 0;
			return;
		}
		if (minute < 30) {
			time[1] = 15;
			return;
		}
		if (minute < 45) {
			time[1] = 30;
			return;
		}
		time[1] = 45;
	}

	// 最近大
	private void ceiling(int[] time) {
		int minute = time[1];
		if (minute == 0 || minute == 15 || minute == 30 || minute == 45) {
			return;
		}
		if (minute < 15) {
			time[1] = 15;
			return;
		}
		if (minute < 30) {
			time[1] = 30;
			return;
		}
		if (minute < 45) {
			time[1] = 45;
			return;
		}
		time[1] = 0;
		time[0] += 1;// wa1!!!!
	}

	private int[] time(String time) {
		return new int[] { Integer.valueOf(time.substring(0, 2)), Integer.valueOf(time.substring(3, 5)) };
	}

}