【华为OD】C卷真题 200分 100%通过:解密犯罪时间 Java代码实现

题目描述:

警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如 “HH:MM” 表示的时刻。

根据警察和线人的约定,为了隐蔽,该时间是修改过的,解密规则为:利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。每个出现数字都可以被无限次使用。

输入描述:

形如HH:SS的字符串,表示原始输入

输出描述:

形如HH:SS的字符串,表示推理出来的犯罪时间

示例1输入输出示例仅供调试,后台判题数据一般不包含示例

输入

18:52

输出

18:55

说明

利用数字1, 8, 5, 2构造出来的最近时刻是18:55,是3分钟之后。结果不是18:51因为这个时刻是23小时59分钟之后。

示例2输入输出示例仅供调试,后台判题数据一般不包含示例

输入

23:59

输出

22:22

说明

利用数字2, 3, 5, 9构造出来的最近时刻是22:22。 答案一定是第二天的某一时刻,所以选择可构造的最小时刻为犯罪时间。

备注:

 

1.    可以保证线人给定的字符串一定是合法的。例如,“01:35” 和 “11:08” 是合法的,“1:35” 和 “11:8” 是不合法的。

2.    最近的时刻有可能在第二天。

 

     668                                                         
                                                            
              +---+                                                          
  3            |   |       ++                               +       +---|   
  |           |   | 3      +                6               +  |   +   |        +
  |      +     |   |       +         +                      +    |  +   |       +
  |      +    |   +---+    +        +        +++++          +   |  +   |        +
  |      +    | +      |   +   +----+        |   |          +   |  +   |        +
  |      +  3 | +      |   +   +    +      2 |   |     2    +   |  +   |        +
  |      +    | +      |   +   +    +        |   |          +   |  +   |        +
  |      +---+ |     |    |  |    +    ----+   |   +---+    |  |  +   |         +
  |      |     |     |    |  |    +    |       |   |   |    |  |  +   |         +
  |    1 |     |     | 8  |  |    +  1 |   |    | 1 |   | 1 |   |  +   |        +
  |      |     |     |    |  |    +    |   |    |   |   |   |   |  +   |        +
  |  +---+     |     +---+   |    ++---+    ++   +---+   +---+   |  +   |        +
  |  |         |         |   |    |         ++              |   |  |+   |        +
  |0 |         |         | 0 |  0 |         ++              | 0 |  |+   |        +
  |  |         |         |   |    |         ++              |   |  |+   |        +
  +---+         +          +-------+                       +---+| +|+   |        +
                +                                                    +   |        +
    0   1   2   3   4   5   6   7   8   9  10  11  12 + v:    w  u m    u 1 0 2 4
 

题目描述:

        需要注意的是,推导出最近的时间,可以是当天最近或者隔一天最近,就看哪个时间更近

代码实现:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static boolean compare(String time1, String time2) {
        int val1 = Integer.parseInt(time1.substring(3));
        int val2 = Integer.parseInt(time2.substring(3));
        if (val2 >= 60) {
            return false;
        }

        return val1 < val2;
    }

    public static boolean compare(String time1) {
        int val1 = Integer.parseInt(time1.substring(0, 2));
        return val1 < 24;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        StringBuffer str = new StringBuffer(scanner.nextLine());
        char buffer[] = str.toString().replace(":", "").toCharArray();
        Arrays.sort(buffer);
        String keys = new String(buffer);

        String time = str.toString();
        StringBuffer target = new StringBuffer();
        for (int i = 0; i < keys.length(); ++i) {
            str.setCharAt(4, keys.charAt(i));
            if (compare(time, str.toString())) {
                target.append(str);
                break;
            }
        }

        if (target.length() > 0) {
            System.out.println(target);
            return;
        }

        str.setCharAt(4, keys.charAt(0));
        for (int i = 0; i < keys.length(); ++i) {
            str.setCharAt(3, keys.charAt(i));
            if (compare(time, str.toString())) {
                target.append(str);
                break;
            }
        }
        if (target.length() > 0) {
            System.out.println(target);
            return;
        }

        str.setCharAt(3, keys.charAt(0));
        for (int i = 0; i < keys.length(); ++i) {
            if (keys.charAt(i) > str.charAt(1)) {
                target.setLength(0);
                target.append(str);
                target.setCharAt(1, keys.charAt(i));
                if (!compare(target.toString())) {
                    target.setLength(0);
                }
                break;
            }
        }
        if (target.length() > 0) {
            System.out.println(target);
            return;
        }
        str.setCharAt(1, keys.charAt(0));

        for (int i = 0; i < keys.length(); ++i) {
            if (keys.charAt(i) > str.charAt(0)) {
                target.setLength(0);
                target.append(str);
                target.setCharAt(0, keys.charAt(i));
                if (!compare(target.toString())) {
                    target.setLength(0);
                }
                break;
            }
        }
        if (target.length() > 0) {
            System.out.println(target);
            return;
        }

        System.out.println(String.format("%c%c:%c%c",
                keys.charAt(0),
                keys.charAt(0),
                keys.charAt(0),
                keys.charAt(0)));
    }
}

【华为OD】C卷真题 200分 100%通过:解密犯罪时间 Java代码实现_第1张图片

 

你可能感兴趣的:(杂谈,华为od,c语言,算法,javascript,java,python,C++)