算法-解密犯罪时间(回溯求全排列

2024-05-11 04:12

本文主要是介绍算法-解密犯罪时间(回溯求全排列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

要求的时间需要晚于当前时间且和当前时间最近。时间串里一共四个数字字符,做全排列即可,使用到回溯算法。把时间串里的“:”剔除后,做回溯爆搜,每取4个字符就判断一次:1.作为时间串是否合法;2.如果合法,反应到最终结果中去;

特殊处理1:当以输入时间串得不到更大的时间时,说明比当前时间更晚的是第二天的时间,又要求这个时间离当前时间最近,所以直接取能得到的最小时间即可。

特殊处理2:当输入“00:00”,“11:11”,“22:22”这些四个位置都相同的时间串时,答案是其本身,含义:第二天的同一时刻。

import java.util.*;
public class Main{public static List<Character> path=new ArrayList<>();public static int base,min=Integer.MAX_VALUE,diff=Integer.MAX_VALUE;public static String ans="",original,minStr="";public static void main(String[] args){Scanner in=new Scanner(System.in);String s=in.nextLine();String[] a=s.split(":");List<Character> list=new ArrayList<>();original=a[0]+a[1];char c=original.charAt(0);int flag=0;list.add(c);for(int i=1;i<4;i++){if(original.charAt(i)!=c){flag=1;}list.add(original.charAt(i));}if(flag==0){System.out.println(s);return;}base=toMinutes(original);dfs(list);if(ans.length()==0){ans=minStr;}ans=ans.substring(0,2)+":"+ans.substring(2,4);System.out.println(ans);}public static void dfs(List<Character> list){if(path.size()==4){String s="";for(char ch:path){s+=ch;  }if(!s.equals(original)&&check(s)){int v=toMinutes(s),d=Math.abs(v-base);// 维护一个最小值,当“没有大于base”发生时,作为最后的值if(v<min){min=v;minStr=s;}if(v>base&&d<diff){ans=s;diff=d;}}return;}for(int i=0;i<4;i++){path.add(list.get(i));dfs(list);path.remove(path.size()-1);}}public static int toMinutes(String s){int h=Integer.parseInt(s.substring(0,2)),m=Integer.parseInt(s.substring(2,4));return h*60+m;}public static boolean check(String s){int h=Integer.parseInt(s.substring(0,2)),m=Integer.parseInt(s.substring(2,4));return h>=0&&h<=23&&m>=0&&m<=59;        }
}

这篇关于算法-解密犯罪时间(回溯求全排列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978471

相关文章

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为