题目描述
题解:
刚一开始,我拿到这道题就直接分析,思考过程:
我认为这四个数的范围应该是这样的:[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& 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 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;
}
};