LeetCode949-给定数字能组成的最大时间
问题:
给定一个由 4 位数字组成的数组,返回可以设置的符合 24 小时制的最大时间。
最小的 24 小时制时间是 00:00,而最大的是 23:59。从 00:00 (午夜)开始算起,过得越久,时间越大。
以长度为 5 的字符串返回答案。如果不能确定有效时间,则返回空字符串。
示例 1:
输入:[1,2,3,4] 输出:"23:41"
示例 2:
输入:[5,5,5,5] 输出:""
提示:
A.length == 4
0 <= A[i] <= 9
链接:https://leetcode-cn.com/contest/weekly-contest-113/problems/largest-time-for-given-digits/
分析:
1.将数字转换为字符串,然后进行全排列
2.从大到小,踢出不合规的,得到的第一个即为最大时间
3.合理时间小时不得大于23,分钟不得大于59
AC Code:
1 class Solution { 2 public: 3 string largestTimeFromDigits(vector<int>& A) { 4 string ret = ""; 5 vector<string> all; 6 string str; 7 sort(A.begin(), A.end()); 8 for (int i = 0; i < A.size(); i++) 9 { 10 str += (char)(A[i] + '0'); 11 } 12 all = GetAll(str); 13 sort(all.begin(), all.end()); 14 //all.erase(unique(all.begin(), all.end()), all.end()); 15 for (int i = all.size()-1; i >= 0; i--) 16 { 17 ret = getValidTime(all[i]); 18 if (ret != "") 19 { 20 return ret; 21 } 22 } 23 return ret; 24 } 25 string getValidTime(string str) 26 { 27 string ret = ""; 28 string hour = ""; 29 hour+= (char)str[0]; 30 hour+=(char)str[1]; 31 string minute = ""; 32 minute += (char)str[2]; 33 minute += (char)str[3]; 34 if (hour>"23") 35 { 36 return ret; 37 } 38 if (minute > "59") 39 { 40 return ret; 41 } 42 return hour + ":" + minute; 43 return ret; 44 } 45 vector<string> GetAll(string str) 46 { 47 vector<string> ret; 48 ret.emplace_back(str); 49 while (next_permutation(str.begin(), str.end())) 50 { 51 ret.emplace_back(str); 52 } 53 return ret; 54 } 55 };
其他:
1.next_permutation 可以获得字符串的下一个全排列,所有需要先排序得到最小的一个,然后继续得到下一个
2.过程中试图逐个判断数字,比如看有没有2,如果有的话看剩下的里面有没有0-3这种方式,浪费一个多小时,涉及到回溯等,不过过程中也暴露出一些掌握的不扎实的基础知识点
2.1 查看vector X中是否有元素x: X.count(X.begin(),X.end(),x),统计该元素的个数,如果0则表示不存在
2.2 删除指定位置的元素:X.erase(X.begin()+index)
3,最开始的直接想法是尝试,过程中发现全排列更好,不过都已经花费了很长时间了,想着实现了再说,结果陷到坑里出不来了,第一个简单题解决用了一个小时,改用全排列后也不过十来分钟。这就是所谓的沉没成本吗?需要尽量克服这种心理。
4.第一code:
1 class Solution { 2 public: 3 string largestTimeFromDigits(vector<int>& A) { 4 sort(A.begin(), A.end()); 5 string answer = ""; 6 7 for (int t = 0; t < 2400; t++) { 8 if (t % 100 >= 60) 9 continue; 10 11 vector<int> digits; 12 int t_copy = t; 13 14 for (int i = 0; i < 4; i++) { 15 digits.push_back(t_copy % 10); 16 t_copy /= 10; 17 } 18 19 sort(digits.begin(), digits.end()); 20 21 if (A == digits) { 22 char str[100]; 23 sprintf(str, "%02d:%02d", t / 100, t % 100); 24 answer = str; 25 } 26 } 27 28 return answer; 29 } 30 };