问题描述
Given a time represented in the format “HH:MM”, form the next closest time by reusing the current digits. There is no limit on how many times a digit can be reused.
You may assume the given input string is always valid. For example, “01:34”, “12:09” are all valid. “1:34”, “12:9” are all invalid.
Example 1:
Input: “19:34”
Output: “19:39”
Explanation: The next closest time choosing from digits 1, 9, 3, 4, is 19:39, which occurs 5 minutes later. It is not 19:33, because this occurs 23 hours and 59 minutes later.
Example 2:
Input: “23:59”
Output: “22:22”
Explanation: The next closest time choosing from digits 2, 3, 5, 9, is 22:22. It may be
题目链接:
思路分析
给一个“HH:MM”格式的时间,找到将4位数字重新组合之后的下一个最接近的时间。时间可以到下一天,4位数字可以重复使用。
A day has 1440 minutes. So we convert the time to minutes first using stoi() and substr() function. Then we add time one by one to get different next time. Using string’s find() function to determine whether a character in nextTime string is existed in the original time string. The first valid nextTime found is the answer.
代码
class Solution {
int minutes[4] = {600, 60, 10, 1};
public:
string nextClosestTime(string time) {
if (time[0] == time[1] && time[0] == time[2] && time[0] == time[3])
return time;
int currentTime = stoi(time.substr(0, 2)) * 60 + stoi(time.substr(3));
string nextTime = "0000";
for (int i = 1, k = 0; i <= 1440; i++){
int difference = (currentTime + i) % 1440;
for (k = 0; k < 4; k++){
nextTime[k] = '0' + difference / minutes[k];
difference = difference % minutes[k];
if (time.find(nextTime[k]) == string::npos)
break;
}
if (k == 4)
break;
}
return nextTime.substr(0, 2) + ':' + nextTime.substr(2);
}
};
时间复杂度:unknown
空间复杂度:unknown
反思
We also need a DFS solution which has 256 comparision to get the final answer.