给定一个由 4 位数字组成的数组,返回能够设置的符合 24 小时制的最大时间。ios
最小的 24 小时制时间是 00:00,而最大的是 23:59。从 00:00 (午夜)开始算起,过得越久,时间越大。git
以长度为 5 的字符串返回答案。若是不能肯定有效时间,则返回空字符串。数组
示例 1:函数
输入:[1,2,3,4] 输出:"23:41"
示例 2:spa
输入:[5,5,5,5] 输出:""
思路1:其实只有4个数字,仍是能够很方便想到全部状况的。先找到<=2和<=5的数的数目is2/is5,再根据is2 = 1/2/3/4分状况讨论,须要注意的是当A[is2 - 1] = 2时,还须要看A[is5-1]是否<=3。仍是比较麻烦。code
思路2:这种涉及数组重组的,就必定能够用排列树哇!并且stl给了个超级好用的函数 prev_permutation/next_permutation,其功能至关于对一个数组不断进行重组使得输出呈降/升序blog
这道题要求给出最大时间,能够先对原数组降序排列获得最大值,而后用prev_permutation进行遍历;相似的,若是要求最小时间,能够先升序排列再用next_permutation进行遍历。遍历终止的条件就是该数组知足条件,在该题里就是数组为有效时间。字符串
#include<iostream> #include<vector> #include<algorithm> #include<string> using namespace std; class Solution { public: string largestTimeFromDigits2(vector<int>& A) { int is2 = 0; int is5 = 0; sort(A.begin(),A.end()); for(int i = 0;i<4;++i){ if(A[i] <= 2) is2++; if(A[i] <= 5) is5++; } if(is5< 2 || is2 < 1) return ""; vector<int> res(5); if(is2 == 4){ res[0] = A[is2-1]; res[1] = A[is2-2]; res[3] = A[is2-3]; res[4] = A[is2-4]; } else if(is2 == 3){ res[0] = A[is2-1]; if(is5 == 3){ if(A[2] != 2 || A[3] <= 3){ res[1] = A[3]; res[3] = A[1]; res[4] = A[0]; } else{ res[1] = A[1]; res[3] = A[0]; res[4] = A[3]; } } else{ if(A[2] != 2 || A[3] <= 3){ res[1] = A[3]; res[3] = A[1]; } else{ res[1] = A[1]; res[3] = A[3]; } res[4] = A[0]; } } else if(is2 == 2){ if(is5 == 2){ if(A[0] == 2) return ""; if(A[1] == 2){ res[0] = A[0]; res[3] = A[1]; } else{ res[0] = A[1]; res[3] = A[0]; } res[1] = A[3]; res[4] = A[2]; } else if(is5 == 3){ res[0] = A[1]; if(A[1] == 2){ if(A[2] <= 3){ res[1] = A[2]; res[3] = A[0]; } else{ res[1] = A[0]; res[3] = A[2]; } res[4] = A[3]; } else{ res[1] = A[3]; res[3] = A[2]; res[4] = A[0]; } } else{ res[0] = A[is2-1]; if(A[1] == 2){ if(A[3] <= 3){ res[1] = A[3]; res[3] = A[2]; res[4] = A[0]; } else if(A[2] <= 3){ res[1] = A[2]; res[3] = A[3]; res[4] = A[0]; } else{ res[1] = A[0]; res[3] = A[3]; res[4] = A[2]; } } else{ res[1] = A[3]; res[3] = A[2]; res[4] = A[0]; } } } else{ res[0] = A[0]; if(A[0] == 2){ if(is5 == 2) return ""; if(is5 == 3){ if(A[2] <= 3){ res[1] = A[2]; res[3] = A[1]; res[4] = A[3]; } else if(A[1] <= 3){ res[1] = A[1]; res[3] = A[2]; res[4] = A[3]; } else return ""; } else{ if(A[3] <= 3){ res[1] = A[3]; res[3] = A[2]; res[4] = A[1]; } else if(A[2] <= 3){ res[1] = A[2]; res[3] = A[3]; res[4] = A[1]; } else if(A[1] <= 3){ res[1] = A[1]; res[3] = A[3]; res[4] = A[2]; } else return ""; } } else{ res[1] = A[3]; if(is5 == 2){ res[3] = A[1]; res[4] = A[2]; } else if(is5 == 3){ res[3] = A[2]; res[4] = A[1]; } else{ res[3] = A[2]; res[4] = A[1]; } } } string s("00:00"); s[0] = res[0] + '0'; s[1] = res[1] + '0'; s[3] = res[3] + '0'; s[4] = res[4] + '0'; return s; } string largestTimeFromDigits(vector<int>& A) { sort(A.begin(),A.end(),greater<int>()); do { cout<<A[0]<<" "<<A[1]<<" "<<A[2]<<" "<<A[3]<<endl; if(A[2] < 6 && (A[0] < 2 || (A[0] == 2 && A[1] < 4))){ string s("00:00"); s[0] = A[0] + '0'; s[1] = A[1] + '0'; s[3] = A[2] + '0'; s[4] = A[3] + '0'; return s; } }while(prev_permutation(A.begin(),A.end())); return ""; } }; int main(){ vector<int> A{1,2,3,4}; Solution s; string res = s.largestTimeFromDigits(A); cout<<res<<endl; return 0; }
输出以下:string
4 3 2 1
4 3 1 2
4 2 3 1
4 2 1 3
4 1 3 2
4 1 2 3
3 4 2 1
3 4 1 2
3 2 4 1
3 2 1 4
3 1 4 2
3 1 2 4
2 4 3 1
2 4 1 3
2 3 4 1
23:41it