题目描述
题解:
刚一开始,我拿到这道题就直接分析,思考过程: 我认为这四个数的范围应该是这样的:[0-2][0-3][0-5][0-9],也就是必须有四个这些个范围的数, 然后要尽可能的时间大,那就是:
从数组中选出<=2最大的数从数组中选出<=3最大的数从数组中选出<=5最大的数从数组中选出<=9最大的数 而且要保证这几个数处于不同的位置,然后就报错了,样例没有通过: 输入0040,我的输出00:40,实际输出04:00,所以我就发现了我的思维错误,当第一个数为0或者1的时候,第二个数是可以为[0-9]的任何数的,然后如果重新按照我之前的做法,就要考虑两种情况了: 第一个数是2:其他的相同第一个数是0或者1,那么第二个数应该是从数组中选出<=9的最大的数,其他相同 但是嫌麻烦,直接看了题解,发现可以直接用枚举法: 其实就是相当于求四个数的全排列,每得到一组数,首先判断是否满足要求(小时数<=23,分钟数<=59),然后求出最大的时间即可,最后要把整数转换为string,是用的自己写的函数。 注意:代码中的三处注意点是我犯的错。代码:
class Solution { public: string largestTimeFromDigits(vector<int>& A) { /* 自己做的,没做出来 // [0-2][0-3][0-5][0-9] // 特殊情况: // a=0,1 b:0-9 // a=2 b:0-3 sort(A.begin(),A.end()); if(A[0] >= 3 || A[1] >= 4 || A[2] >= 6 || A[3] >= 10) { // 最小的数必须<3 次小的数必须<5 第二大的数必须<6 最大的数必须<10 return ""; } int a=-1,b=-1,c=-1,d=-1;// ab:cd int ia,ib,ic,id; // 找到数组中<=2最大的数 for(int i = 0; i < 4; i++) { if(A[i] <= 2 && A[i] > a) { a = A[i]; ia = i; } } // 找到数组中<=3最大的数 for(int i = 0; i < 4; i++) { if(A[i] <= 3 && A[i] > b && i != ia) { b = A[i]; ib = i; } } // 找到数组中<=5最大的数 for(int i = 0; i < 4; i++) { if(A[i] <= 5 && A[i] > c && i != ia && i != ib) { c = A[i]; ic = i; } } // 找到数组中<=9最大的数 for(int i = 0; i < 4; i++) { if(A[i] <= 9 && A[i] > d && i != ia && i != ib && i != ic) { d = A[i]; id = d; } } string maxTime = ""; maxTime += (a+'0'); maxTime += (b+'0'); maxTime += ":"; maxTime += (c+'0'); maxTime += (d+'0'); return maxTime;*/ /* 枚举法 */ string maxTime = ""; int Hour = -1,Minite = -1;// Hour,Minite(比较两个时间:1. 先比较小时 2. 再比较分钟) for(int i = 0; i < 4; i++)// 0 1 2 3 { for(int j = 0; j < 4; j++) { if(j == i) continue; for(int k = 0; k < 4; k++) { if(k == i || k == j) continue; int r = 6-(i+j+k); // 小时一定<=23,分钟一定<=59 int hour = A[i]*10 + A[j]; int minite = A[k]*10 + A[r]; //printf("i=%d,j=%d,k=%d,r=%d\n",i,j,k,r); //printf("hour:%d Minite:%d\n",hour,minite); if(hour <= 23 && minite <= 59) { if(hour > Hour) { Hour = hour; Minite = minite; } else if(hour == Hour) { if(minite > Minite) { Hour = hour; Minite = minite; } } } } } } //cout << "Hour: " + itos(Hour) << endl; //cout << "Minite: " + itos(Minite) << endl; //printf("Hour:%d Minite:%d\n",Hour,Minite); if(Hour == -1 && Minite == -1) { return "";// 注意点:如果没有被赋值,说明没有满足条件的情况,直接返回"" } maxTime = itos(Hour) + ":" + itos(Minite); return maxTime; } string itos(int i) { if(i == 0) { return "00";// 注意点:0对应"00" } string str = ""; vector <int> v; while(i) { v.push_back(i%10); i /= 10; } if(v.size() == 1) { str += "0";// 注意点:一位数前面要加个"0" } for(int i = (int)v.size()-1; i >= 0; i--) { char ch = v[i]+'0'; str += ch; } return str; } };