题目描述
题目来源
题目解析
思路一
举个例子:对于[12, 24],拆成[1, 2, 4], 对列表中这三个数从小到大进行排列组合,分别是:11:11/11:12/11:21 这样子类推,然后大于 12:24 的时间便可以返回,否则返回最小的时间组合
思路二
- 先预处理:
- 获取可能的备选排列
- 将字符串拆分成M和H
- 先获取所有可能的分钟排列minList。比如说
- 当前已有: [1, 2, 2, 4]:那么可以组成:12、12、14、21、22、24、41、42、42、44
- 然后对上面进行升序: 12、12、14、21、22、24、41、42、42、44
- 然后我们判断是不是改变分钟就可以得到最近的值,如果发现minList有备选值 > M,那么返回H : minList[i]
- 如果没有,那么我们看是否可以改变小时
- 如果H在24一下,我们使用最近的小时数
- 遍历minList,如果发现i > H && i <=24,那么返回 i : list[0] (list[0]是能够组成的最小的分钟)
- 否则,就是23:59,00:00,这样特殊的值:
- 22:22
class Solution{
std::string format(std::string HH, std::string MM){
auto hour = HH.length() == 2 ? HH : "0"+ HH;
auto min = MM.length() == 2 ? MM : "0" + MM;
return hour + ":" + min;
}
public:
std::string process(std::string &time){
std::string HHstr = time.substr(0, 2);
std::string MMstr = time.substr(3, 2); // 11:22
int HH = stoi(HHstr);
int MM = stoi(MMstr);
std::vector<int> nums;
for(auto c : time){
if(c != '.'){
nums.push_back(c - '0');
}
}
std::vector<char> list;
for(int i : nums){
for(int j : nums){
if(i <= 5){
list.push_back(i * 10 + j);
}
}
}
std::sort(list.begin(), list.end());
for(int i : list){
if(i <= MM){
continue;
}
return format(HHstr, std::to_string(i));
}
if(HH != 23){
for(int i : list){
if(i < HH){
continue;
}
return format(std::to_string(i) , to_string(list[0]));
}
}
return format(to_string(list[0]), to_string(list[0]));
}
};
int main(){
std::string line;
while (getline(cin, line)){
Solution a;
std::cout << a.process(line) << "\n";
}
return 0;
}