LeetCode算法题解 949.-给定数字能组成的最大时间

题目描述

题解

刚一开始,我拿到这道题就直接分析,思考过程:
我认为这四个数的范围应该是这样的:[0-2][0-3][0-5][0-9],也就是必须有四个这些个范围的数,
然后要尽可能的时间大,那就是:

  • 从数组中选出<=2最大的数
  • 从数组中选出<=3最大的数
  • 从数组中选出<=5最大的数
  • 从数组中选出<=9最大的数
    而且要保证这几个数处于不同的位置,然后就报错了,样例没有通过:
    输入0040,我的输出00:40,实际输出04:00,所以我就发现了我的思维错误,当第一个数为0或者1的时候,第二个数是可以为[0-9]的任何数的,然后如果重新按照我之前的做法,就要考虑两种情况了:
  1. 第一个数是2:其他的相同
  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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值