LeetCode最近时刻

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-closest-time
给定一个形如 “HH:MM” 表示的时刻,利用当前出现过的数字构造下一个距离当前时间最近的时刻。每个出现数字都可以被无限次使用。

你可以认为给定的字符串一定是合法的。例如,“01:34” 和 “12:09” 是合法的,“1:34” 和 “12:9” 是不合法的。
样例 1:
输入: “19:34”
输出: “19:39”
解释: 利用数字 1, 9, 3, 4 构造出来的最近时刻是 19:39,是 5 分钟之后。结果不是 19:33 因为这个时刻是 23 小时 59 分钟之后。
样例 2:
输入: “23:59”
输出: “22:22”
解释: 利用数字 2, 3, 5, 9 构造出来的最近时刻是 22:22。 答案一定是第二天的某一时刻,所以选择可构造的最小时刻。

思路:四个位置最大就是9^4种情况,抛去不存在的数字,直接四层循环枚举即可,用当前得到的四个数,减去所给的四个数,找最小的,但要注意第二天的情况,如11:11,第二天的情况也是11:11,此时枚举到的减去所给的等于0(也可能小于零),直接加上2460,即到达第二天的时间。取最小即可

class Solution {
public:
    int i, j, k, l, sj, shu = 10000000, shu1;
    int num1, num2, num3, num4, num, ans1, ans2;
    string s;
    bool f[20];
    string nextClosestTime(string time) {
        num1 = time[0] - '0';
        num2 = time[1] - '0';
        num3 = time[3] - '0';
        num4 = time[4] - '0';
      
        num = num1*1000 + num2*100 + num3*10 + num4;  
       // return to_string(num);
        f[num1] = true;
        f[num2] = true;
        f[num3] = true;
        f[num4] = true;
        for (i = 0; i <= 2; i++){
            if (f[i]){
                for (j = 0; j <= 9; j++){
                    if (f[j] && (i * 10 + j < 24)){
                        for (k = 0; k <= 5; k++){
                            if (f[k]){
                                for (l = 0; l <=9; l++){
                                    if (f[l]){
                                        sj = i*1000 + j*100 + k*10 + l;
                                        shu1 = sj - num;
                                        if (shu1 <= 0)
                                            shu1 += 2460;
                                        if (shu1 < shu){
                                            shu = shu1;
                                            ans1 = i*10 + j;
                                            ans2 = k*10 + l;
                                        }
                                    }
                                   
                                }
                            }
                        }
                    }
                }
            }
        }
        if (ans1 < 10) 
          s = "0";
        s += to_string(ans1);
        s += ":";
        if (ans2 < 10)
          s += "0";
        s += to_string(ans2);
        return s;
    }
};
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值