解密犯罪时间JAVA

发现网上找到的代码全是错的,而且没有java版本,以免大家再被错误代码误导,特此写一个正确的版本贴上来。

题目

警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如 “HH:MM” 表示的时刻。
根据警察和线人的约定,为了隐蔽,该时间是修改过的,解密规则为:利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。每个出现数字都可以被无限次使用。"  

示例

20:12得到20:20
23:59得到22:22
12:58得到15:11
18:52得到18:55
23:52得到23:53
09:17得到09:19
07:08得到08:00

package algorithm;

import java.util.ArrayList;
import java.util.Comparator;

/**
 * @BelongsProject: LeetCode
 * @BelongsPackage: algorithm
 * @Author: tongyuan
 * @CreateTime: 2022-01-20 01:29
 * @Description:
 */
public class NextTime {


    public static String fun(String time) {
        char[] chars = time.toCharArray();
        //单个数字list
        ArrayList<Integer> nums = new ArrayList<>();
        for (char c : chars) {
            if (c != ':') {
                nums.add(c - '0');
            }
        }
        String[] split = time.split(":");
        //小时
        Integer H = Integer.parseInt(split[0]);
        //分钟
        Integer M = Integer.parseInt(split[1]);
        ArrayList<Integer> list = new ArrayList<>();
        for (int i : nums) {
            for (int j : nums) {
                if (i <= 5) {
                    list.add(i * 10 + j);
                }
            }
        }
        //备选项排序,既可当H,也可以当M
        list.sort(Comparator.comparing(o -> o));
        //仅仅改变分钟就能得到最近的值
        for (int i : list) {
            if (i <= M) {
                continue;
            }
            //12:13 -> 12:31
            return format(H + ":" + i);
        }
        //小时数在23以下,可以使用最近的小时数
        if (H != 23) {
            for (int i : list) {
                if (i <= H) {
                    continue;
                }
                //确保i的合法性
                if (i<=23){
                    //12:59 ->15:11
                    return format(i + ":" + list.get(0));
                }
            }
        }
        //无法改别最近的小时与分钟。如23:59,00:00,15:15
        return format(list.get(0) + ":" + list.get(0));
    }

    public static String format(String time) {
        String[] split = time.split(":");
        String H = split[0];
        String M = split[1];
        H = H.length() == 2 ? H : "0" + H;
        M = M.length() == 2 ? M : "0" + M;
        return H + ":" + M;
    }

    public static void main(String[] args) {
        System.out.println("20:12" + "得到" + fun("20:12"));
        System.out.println("23:59" + "得到" + fun("23:59"));
        System.out.println("12:58" + "得到" + fun("12:58"));
        System.out.println("18:52" + "得到" + fun("18:52"));
        System.out.println("23:52" + "得到" + fun("23:52"));
        System.out.println("09:17" + "得到" + fun("09:17"));
        System.out.println("07:08" + "得到" + fun("07:08"));
        System.out.println("22:59" + "得到" + fun("22:59"));
        System.out.println("22:39" + "得到" + fun("22:39"));
//        20:12得到20:20
//        23:59得到22:22
//        12:58得到15:11
//        18:52得到18:55
//        23:52得到23:53
//        09:17得到09:19
//        07:08得到08:00
//        22:59得到22:22
//        22:39得到23:22
    }
}

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值