题目:

给定一个"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[]-'', time[]-'', time[]-'', time[]-''} ;
vector<int> currTime(, );
int hour = number[]* + number[];
int minute = number[]* + number[];
int times = toMinute(hour, minute);
int bestTime = times;
dfs(number, , currTime, times, bestTime);
string s = to_string(bestTime/) + ":" + to_string(bestTime%);
char buff[];
sprintf(buff, "%02d:%02d", bestTime / , bestTime % );
return string(buff);
}
void dfs(vector<int> &number, int deep, vector<int>& currTime, int times, int& bestTime){
if(deep == ){
if(currTime[]* + currTime[] > || currTime[]* + currTime[] > )
return;
int currMinutes = toMinute(currTime[]* + currTime[], currTime[]* + currTime[]);
if(diff(times, currMinutes) < diff(times, bestTime)){
bestTime = currMinutes;
}
return;
}
for(int i:number){
currTime[deep] = i;
dfs(number, deep+, currTime, times, bestTime);
}
return;
}
int toMinute(int hour, int minute){
return hour* + minute;
}
int diff(int time1, int time2){
if(time1 == time2)
return ;
return (( - time1) + time2) % ;
}
};

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;
}

LeetCode 681. Next Closest Time 最近时刻 / LintCode 862. 下一个最近的时间 (C++/Java)的更多相关文章

  1. [LeetCode] 681. Next Closest Time 下一个最近时间点

    Given a time represented in the format "HH:MM", form the next closest time by reusing the ...

  2. leetcode 681. Next Closest Time

    Given a time represented in the format "HH:MM", form the next closest time by reusing the ...

  3. 当有多于64合乎逻辑的cpu时刻,Windows 下一个Oracle db 实例启动(startup)什么时候会hang(待定)

    Bug 9772171 - Database startup hangs on Windows when machine has more than 64 cores [ID 9772171.8] 该 ...

  4. LeetCode (13): 3Sum Closest

    https://leetcode.com/problems/3sum-closest/ [描述] Given an array S of n integers, find three integers ...

  5. [LeetCode] Next Closest Time 下一个最近时间点

    Given a time represented in the format "HH:MM", form the next closest time by reusing the ...

  6. LeetCode 16. 3Sum Closest(最接近的三数之和)

    LeetCode 16. 3Sum Closest(最接近的三数之和)

  7. LeetCode——16. 3Sum Closest

    一.题目链接:https://leetcode.com/problems/3sum-closest/ 二.题目大意: 给定一个数组A和一个目标值target,要求从数组A中找出3个数来,使得这三个数的 ...

  8. [LeetCode] Next Permutation 下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  9. LeetCode 31. Next Permutation (下一个排列)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

随机推荐

  1. Java截图小程序源码

    Java编写的全屏截图小程序 package cnom.test.testUtils; import java.awt.AWTException; import java.awt.Dimension; ...

  2. axios封装的拦截器的应用

    axios拦截器   页面发送http请求,很多情况我们要对请求和其响应进行特定的处理:如果请求数非常多,单独对每一个请求进行处理会变得非常麻烦,程序的优雅性也会大打折扣.好在强大的axios为开发者 ...

  3. Fabric1.4:链码管理与测试

    1 链码介绍 智能合约在 Hyperledger Fabric 中称为链码(chaincode),是提供分布式账本的状态处理逻辑.链码被部署在fabric 的网络节点中,能够独立运行在具有安全特性的受 ...

  4. mqtt实现跨平台跨应用通讯

    介绍 最近物联网应用一直很火,也打算做一些这方面的尝试,就边学边做在家花了2天时间做了一个简单demo,功能很简单,使用emq x 作为mqtt broker,用python写了一个定时抓取主机CPU ...

  5. Go 每日一库之 go-flags

    简介 在上一篇文章中,我们介绍了flag库.flag库是用于解析命令行选项的.但是flag有几个缺点: 不显示支持短选项.当然上一篇文章中也提到过可以通过将两个选项共享同一个变量迂回实现,但写起来比较 ...

  6. css控制div等比高度

    在移动端开发中,在banner轮播图未加载出来之前,banner层是不占文档流高度的,当从服务器获取完banner数据,展示的时候,banner层因为有了内容 所以会撑开,导致banner层下面的内容 ...

  7. 贪心 + DFS

    A New Year party is not a New Year party without lemonade! As usual, you are expecting a lot of gues ...

  8. Java 中的等待唤醒机制透彻讲解

    线程的状态 首先了解一下什么是线程的状态,线程状态就是当线程被创建(new),并且启动(start)后,它不是一启动就进入了执行状态(run),也不是一直都处于执行状态. 这里说一下Java 的Thr ...

  9. MySQL:如何查询出每个分组中的 top n 条记录?

    问题描述 需求: 查询出每月 order_amount(订单金额) 排行前3的记录. 例如对于2019-02,查询结果中就应该是这3条: 解决方法 MySQL 5.7 和 MySQL 8.0 有不同的 ...

  10. Postman 的替代品来了

    Postwoman 一个开源.免费.快速.漂亮的 API 构建器,可以替代 Postman. 这个名字起得挺有意思,感觉像 Postman 的媳妇. Postwoman 的诞生过程: 它的作者是一个全 ...