题目描述
Calculate the next closest time.
样例
Input: “19:34”
Output: “19:39”
题目分析
看到要算下一个最近的时间点,难免想的就是最近的时间点了,不过后来发现,物极必反,想想除了下一个最近的时间点,下一个最远的时间点是什么呢?(主要是有利于edge case). 不难想,下一个最远的时间点就是相同的时间点。好困,我先保存一下,明天再来写。
算法1
$O(1)$
blablabla
时间复杂度分析:blablabla
C++ 代码
class Solution {
public:
string nextClosestTime(string time) {
set<int> digits;
for (int i = 0; i < time.size(); i++) {
if (time[i] == ':') {
continue;
}
digits.insert(time[i]-'0');
}
int h1 = time[0] - '0';
int h0 = time[1] - '0';
int m1 = time[3] - '0';
int m0 = time[4] - '0';
set<int>::iterator it = digits.find(m0);
set<int>::iterator end = digits.end();
end--;
if (it != end) {
m0 = *(++it);
} else {
m0 = *digits.begin();
it = digits.find(m1);
if (it == end || *(++it) > 5) {
m1 = *digits.begin();
it = digits.find(h0);
if (h1 == 2) {
if (it == end || *(++it) > 3) {
h0 = *digits.begin();
h1 = *digits.begin();
} else {
h0 = *it;
}
} else {
if (it == end) {
h0 = *digits.begin();
it = digits.find(h1);
if (it == end || *(++it) > 2) {
h1 = *digits.begin();
} else {
h1 = *it;
}
} else {
h0 = *(++it);
}
}
} else {
m1 = *it;
}
}
return to_string(h1) + to_string(h0) + ":" + to_string(m1) + to_string(m0);
}
};