zoukankan      html  css  js  c++  java
  • LeetCode 681. Next Closest Time 最近时刻 / LintCode 862. 下一个最近的时间 (C++/Java)

    题目:

    给定一个"HH:MM"格式的时间,重复使用这些数字,返回下一个最近的时间。每个数字可以被重复使用任意次。

    保证输入的时间都是有效的。例如,"01:34","12:09" 都是有效的,而"1:34","12:9"都不是有效的时间。

    样例

    样例 1:

    输入: "19:34"
    输出: "19:39"
    解释: 
      从1,9,3,4中选出的下一个最近的时间是19:39,它是五分钟后。
      答案不是19:33,因为它是23小时59分钟后。
    

    样例 2:

    输入: "23:59"
    输出: "22:22"
    解释: 可以假设所返回的时间是第二天的时间,因为它在数字上小于给定的时间。

    分析:

    LeetCode681需要订阅才可以查看,好在LintCode上有相同的题目。

    给定一个"HH:MM"格式的时间,利用所有数字拼凑出新的时间(可以重复),使其成为下一个最近的时间,且保证时间有效。

    特例是像"00:00"的最近时间就是"00:00",实际上是过了24小时。

    可以将每一位的数字替换成给的时间内的四个数字(最多4个),总计最多4^4种情况,同时检验时间是否有效,小时小于24,分钟小于60。

    然后计算拼出的时间和原时间的差值,求得最小的即可,注意求差时容易出现负值,要处理一下。

    程序:

    C++

    class Solution {
    public:
        /**
         * @param time: the given time
         * @return: the next closest time
         */
        string nextClosestTime(string &time) {
            // write your code here
            vector<int> number {time[0]-'0', time[1]-'0', time[3]-'0', time[4]-'0'} ;
            vector<int> currTime(4, 0);
            int hour = number[0]*10 + number[1];
            int minute = number[2]*10 + number[3];
            int times = toMinute(hour, minute);
            int bestTime = times;
            dfs(number, 0, currTime, times, bestTime);
            string s = to_string(bestTime/60) + ":" + to_string(bestTime%60);
            char buff[5];
            sprintf(buff, "%02d:%02d", bestTime / 60, bestTime % 60);
            return string(buff);
        }
        void dfs(vector<int> &number, int deep, vector<int>& currTime, int times, int& bestTime){
            if(deep == 4){
                if(currTime[0]*10 + currTime[1] > 23 || currTime[2]*10 + currTime[3] > 59)
                    return;
                int currMinutes = toMinute(currTime[0]*10 + currTime[1], currTime[2]*10 + currTime[3]);
                if(diff(times, currMinutes) < diff(times, bestTime)){
                    bestTime = currMinutes;
                }
                return;
            }
            for(int i:number){
                currTime[deep] = i;
                dfs(number, deep+1, currTime, times, bestTime);
            }
            return;
        }
        int toMinute(int hour, int minute){
            return hour*60 + minute;
        }
        int diff(int time1, int time2){
            if(time1 == time2)
                return 1440;
            return ((1440 - time1) + time2) % 1440;
        }
    };

     Java

    public class Solution {
        /**
         * @param time: the given time
         * @return: the next closest time
         */
        public String nextClosestTime(String time) {
            // write your code here
            char tTime[] = time.toCharArray();
            int[] number = new int[]{tTime[0]-'0', tTime[1]-'0', tTime[3]-'0', tTime[4]-'0'};
            int[] currTime = new int[4];
            int hour = number[0]*10 + number[1];
            int minute = number[2]*10 + number[3];
            int times = toMinute(hour, minute);
            bestTime = times;
            dfs(number, currTime, 0, times);
            String res = String.format("%02d:%02d", bestTime/60, bestTime%60);
            return res;
        }
        public void dfs(int[] number, int[] currTime, int deep, int times){
            if(deep == 4){
                if(currTime[0]*10+currTime[1] > 23 || currTime[2]*10+currTime[3] > 59)
                    return;
                int currMinutes = toMinute(currTime[0]*10+currTime[1], currTime[2]*10+currTime[3]);
                if(diff(times, currMinutes) < diff(times, bestTime)){
                    bestTime = currMinutes;
                }
                return;
            }
            for(int i = 0; i < 4; ++i){
                currTime[deep] = number[i];
                dfs(number, currTime, deep+1, times);
            }
            return;
        }
        public int toMinute(int hour, int minute){
            return hour*60 + minute;
        }
        public int diff(int time1, int time2){
            if(time1 == time2)
                return 1440;
            return ((1440 - time1) + time2) % 1440;
        }
        private int bestTime;
    }
  • 相关阅读:
    函数初识
    文件操作
    CentOS 7运维管理笔记(6)----Apache 基于 IP 的虚拟主机配置
    CentOS 7运维管理笔记(4)----安装ftp服务器
    CentOS 7运维管理笔记(3)----Linux路由器配置
    CentOS 7运维管理笔记(2)----修改命令提示符颜色
    CentOS 7运维管理笔记(1)----设置默认启动模式为GUI模式或命令行模式
    CentOS 7运维管理笔记(5)----源代码安装Apache 2.4,搭建LAMP服务器
    CentOS 7 下 安装Webmin 启动防火墙失败----Applying firewall rules:iptables-restore:line 2 failed
    CentOS 7 禁用IPV6以提高网速
  • 原文地址:https://www.cnblogs.com/silentteller/p/12319088.html
Copyright © 2011-2022 走看看