LeetCode949-给定数字能组成的最大时间

问题:

给定一个由 4 位数字组成的数组,返回可以设置的符合 24 小时制的最大时间。

最小的 24 小时制时间是 00:00,而最大的是 23:59。从 00:00 (午夜)开始算起,过得越久,时间越大。

以长度为 5 的字符串返回答案。如果不能确定有效时间,则返回空字符串。

示例 1:

输入:[1,2,3,4]
输出:"23:41"

示例 2:

输入:[5,5,5,5]
输出:""

提示:

  1. A.length == 4
  2. 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 };

猜你喜欢

转载自www.cnblogs.com/youdias/p/10052924.html
今日推荐