题目:

给定一个"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. 菜鸟学习Fabric源码学习 — 背书节点和链码容器交互

    Fabric 1.4 源码分析 背书节点和链码容器交互 本文档主要介绍背书节点和链码容器交互流程,在Endorser背书节点章节中,无论是deploy.upgrade或者调用链码,最后都会调用Chai ...

  2. Redis内存碎片清理

    当Redis中清理了大量的Key之后原先Redis申请的内存(used_memory_rss)将继续持有而不会释放,此时查看内存信息将会看到存在大量的内存碎片.那么,Redis的内存碎片可以清理么,该 ...

  3. Queue and deque

    Queue : 队列 队列(Queue)是常用的数据结构,可以将队列看成特殊的线性表,队列限制了对线性表的访问方式:只能从线性表的一端添加(offer)元素,从另一端取出(poll)元素. 队列遵循先 ...

  4. Have Fun with Numbers

    Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, wit ...

  5. swiper如何禁止左右箭头切换

    swiper做项目时,需求 带着左右两边的箭头, 场景1:swiper自动切换,此时左右箭头点击时不能切换   场景2:swiper手动切换,左右箭头可以实现切换,通过翻阅api 终于找到 <s ...

  6. Codeforces - A. Watermelon

    A. Watermelon time limit per test 1 second memory limit per test 64 megabytes input standard input o ...

  7. 测试必备之Java知识(三)—— 集合、Map相关

    集合相关 List.Set.Map的区别 类型 描述 List 允许重复对象,可插入多个null元素,有序 Set 不允许重复对象,只允许一个null元素,无序 Map 不是collection的子接 ...

  8. EasyExcel 自定义单元格式的问题。

    最近在做一个关于性能测试管理系统,一个新的需求,需要导出测试报告,直接使用了ali的封装的EasyExcel,但是在复杂头与一些样式,就缺少了自定义的灵活性,在官方demo中没有找到很好的解决方法. ...

  9. 2.Scanner的进阶使用

    package com.duan.scanner; import java.util.Scanner; public class Demo04 { public static void main(St ...

  10. 为BlueLake主题增加自定义icon图标

    一.前言 hexo 的 Bluelake 主题是我一直在用的,简单大方,很喜欢.但最近有了添加自定义 icon 图标的需求,比如,添加 "地址"."扫一扫".& ...