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

Given a time represented in the format "HH:MM", form the next closest time by reusing the current digits. There is no limit on how many times a digit can be reused.

You may assume the given input string is always valid. For example, "01:34", "12:09" are all valid. "1:34", "12:9" are all invalid.

Example 1:

Input: "19:34"
Output: "19:39"
Explanation: The next closest time choosing from digits 1, 9, 3, 4, is 19:39, which occurs 5 minutes later. It is not 19:33, because this occurs 23 hours and 59 minutes later.

Example 2:

Input: "23:59"
Output: "22:22"
Explanation: The next closest time choosing from digits 2, 3, 5, 9, is 22:22. It may be assumed that the returned time is next day's time since it is smaller than the input time numerically.

这道题给了我们一个时间点,让我们求最近的下一个时间点,规定了不能产生新的数字,当下个时间点超过零点时,就当第二天的时间。为了找到下一个时间点,我们肯定是从分钟开始换数字,而且换的数字要是存在的数字,那么我们最先要做的就是统计当前时间点中的数字,由于可能有重复数字的存在,我们把数字都存入集合set中,这样可以去除重复数字,并且可以排序,然后再转为vector。下面就从低位分钟开始换数字了,如果低位分钟上的数字已经是最大的数字了,那么说明要转过一轮了,就要把低位分钟上的数字换成最小的那个数字;否则就将低位分钟上的数字换成下一个数字。然后再看高位分钟上的数字,同理,如果高位分钟上的数字已经是最大的数字,或则下一个数字大于5,那么直接换成最小值;否则就将高位分钟上的数字换成下一个数字。对于小时位上的数字也是同理,对于小时低位上的数字情况比较复杂,当小时高位不为2的时候,低位可以是任意数字,而当高位为2时,低位需要小于等于3。对于小时高位,其必须要小于等于2,参见代码如下:

解法一:

class Solution {

public:
 string nextClosestTime(string time) {
 string res = time;
 set<int> s{time[0], time[1], time[3], time[4]};
 string str(s.begin(), s.end());
 for (int i = res.size() - 1; i >= 0; --i) {
 if (res[i] == ':') continue;
 int pos = str.find(res[i]);
 if (pos == str.size() - 1) {
 res[i] = str[0];
 } else {
 char next = str[pos + 1];
 if (i == 4) {
 res[i] = next;
 return res;
 } else if (i == 3 && next <= '5') {
 res[i] = next;
 return res;
 } else if (i == 1 && (res[0] != '2' || (res[0] == '2' && next <= '3'))) {
 res[i] = next;
 return res;
 } else if (i == 0 && next <= '2') {
 res[i] = next;
 return res;
 }
 res[i] = str[0];
 }
 }
 return res;
 }
}; 

下面这种方法的写法比较简洁,实际上用了暴力搜索,由于按分钟算的话,一天只有1440分钟,也就是1440个时间点,我们可以从当前时间点开始,遍历一天的时间,也就是接下来的1440个时间点,得到一个新的整型时间点后,我们按位来更新结果res,对于每个更新的数字字符,看其是否在原时间点字符中存在,如果不存在,直接break,然后开始遍历下一个时间点,如果四个数字都成功存在了,那么将当前时间点中间夹上冒号返回即可,参见代码如下:

解法二:

class Solution {

public:
 string nextClosestTime(string time) {
 string res = "0000";
 vector<int> v{600, 60, 10, 1};
 int found = time.find(":");
 int cur = stoi(time.substr(0, found)) * 60 + stoi(time.substr(found + 1));
 for (int i = 1, d = 0; i <= 1440; ++i) {
 int next = (cur + i) % 1440;
 for (d = 0; d < 4; ++d) {
 res[d] = '0' + next / v[d];
 next %= v[d];
 if (time.find(res[d]) == string::npos) break;
 }
 if (d >= 4) break;
 }
 return res.substr(0, 2) + ":" + res.substr(2);
 }
};

参考资料:

https://discuss.leetcode.com/topic/104692/c-java-clean-code

https://discuss.leetcode.com/topic/104736/concise-java-solution

https://discuss.leetcode.com/topic/105411/short-simple-java-using-regular-expression

本文转自博客园Grandyang的博客,原文链接:[LeetCode] Next Closest Time 下一个最近时间点

,如需转载请自行联系原博主。

时间: 2024-08-04 13:04:01

[LeetCode] Next Closest Time 下一个最近时间点的相关文章

下一期名人时间拍卖的主题是针对80后的一场活动

"优米网史玉柱时间拍卖"媒体发布会在人民大学优米演播室举行,巨人集团董事长史玉柱.优米网总编辑王利芬出席了此次活动.史玉柱在现场否认外界传言脑白金功效不实一说,并透露自己每天吃脑白金以保证睡眠,"说脑白金功效不属实,能骗一年两年,可是销售了13年,业绩还在上升,在全世界科学界.医学界.营养专家是有共识的,这就说明脑白金还是有一定的功效,只不过被媒体的宣传妖魔化了.""都说脑白金取得的成绩是一种营销手段,但是如果产品不好,只有营销手段也是不够的."

LeetCode 31 Next Permutation(下一个排列)

翻译 实现"下一个排列"函数,将排列中的数字重新排列成字典序中的下一个更大的排列. 如果这样的重新排列是不可能的,它必须重新排列为可能的最低顺序(即升序排序). 重排必须在原地,不分配额外的内存. 以下是一些示例,左侧是输入,右侧是输出: 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 原文 Implement next permutation, which rearranges numbers into the lexicographically

jquery each-jQuery each循环中隔一段时间后,再执行下一个循环

问题描述 jQuery each循环中隔一段时间后,再执行下一个循环 初步涉及脚本,请各位大神给予帮忙. 脚本如下,在执行ajax异步调用后,会到后台执行相关方法,需要时间等待.所以需要延长时间后再进入第二次循环.请问怎么实现?是用setTimeOut吗?又怎么实现? $('#btnExecute').click(function(){ $('#tbFileList').find(":checkbox:checked").each(function(){ var filename= $

Web2.0下一个版本是什么

web|web2 在最近的一次会议上,有一个客户要求他的应用程序能够支持Web 2.0:很显然他读过很多关于Web 2.0的文章.我回答了他,向他解释了Web及其技术的发展过程,以及Web 2.0只是一个概念的事实.最后,这个应用程序的确用到了Web 2.0的概念,但是这让我在思考Web的版本号的问题. 1.0版去哪里了? Web 最开始的时候炙手可热,各种公司和个人都想知道如何使用这个新的媒介.其动力是将信息发布给用户.各种不同的内容管理系统被开发出来,并被用来管理信息的及时发布.此外,个人W

微博将会成为SEO的下一个利器

在2011年,微博成为商家必争之地,可以预见的是:基于微博的微营销也将成为不少企业下一步的营销重点.可以说,2011年谁能更加重视微博的巨大价值,谁能更早一步探索出适合自身特点的微薄营销之路,谁就能在这个"新大陆"上获得丰硕的回报.最近,博石石头在给seo牛人网的版主进行培训的时候,有很多学生都在问我,石头老师,微博能被百度收录吗?微博能参与百度的排名吗?微博做外链吗?很多很多类似的问题,可以看到,目前为止,绝大部分的seoer都不知道微博到底跟seo有没有关系,下面就由博石石头给大家

SPOJ 查找下一个回文Palindrome 算法题解

给出一个数值,well,其实不是数值了,而是一大串数字, 比如 98237482340328490328490324893024,非常长的数字. 找出下一个Palindrome,这个Palindrome在数值上要比当前数值大(不能等于). 如: 9 9 9 9->1 0 0 0 1 1 2 3 4 5 ->1 2 4 2 1 本算法时间效率是O(n),其中n是指数值的位数,不是数值,比如123456789,只有9位,那么本算法接近常数: 更多精彩内容:http://www.bianceng.c

【TensorFlow开源2年官方回顾】下一个重要方向是分布式模型服务

 TensorFlow Serving 开源的一年半时间里取得了许多进展和性能提升,包括开箱即用的优化服务和可定制性,多模型服务,标准化模型格式,易于使用的推理API等.本文是研究团队撰写的回顾,并提出接下来创新的方向是Granular batching和分布式模型服务. 自从2016年2月 TensorFlow Serving 开源以来,我们做了一些重大改进.现在,让我们再回到这个项目开始的地方,回顾我们的进展过程,并分享我们下一步的方向. 在 TensorFlow Serving 启动之前,

下一步,下一个?

写之前特地注意了一下上一篇的日期:2月23日,到现在刚好两个月.两个月前,还在联络家,正运筹着年前规划的工作计划的执行:两个月后,确是已经在谋划自己接下来要做的事情,在筹备个方面的资源. 这个世界上,变是常理,所以,对于变的应对,也须是常态,只有这样,才会让自己无论做什么事,都能够从容,都能够自信:驾驭它,而不是顺从它. 以上是偶感,记录下,也算是另一个开始的起点. ------------------------– 早上,收到来自http://www.aliyun.com/zixun/aggr

专访马云:下一个星辰大海是百货商店

本文讲的是专访马云:下一个星辰大海是百货商店 "在开拓海外市场方面,即便是马化腾也不如我们有经验" 马云畅谈了阿里巴巴与腾讯的竞争及全球扩张 在杂货配送领域大获成功后,阿里巴巴集团控股有限公司(Alibaba Group Holding Ltd. )又瞄准了中国4万亿美元零售市场的另外一个领域:百货商店. 阿里巴巴集团董事局主席马云.执行副主席蔡崇信(Joseph Tsai)和首席执行官张勇(Daniel Zhang)在公司成立18周年之际接受彭博新闻社(Bloomberg News)