使用数字数组实现"24 hour time"



最近我在考试中遇到了一个问题。我将给出一个数组的4个数字和使用,我必须构建最大可能的24小时时间格式。例如:如果输入数组是[1,3,5,2],那么答案将是"23:51"。如果输入数组为[1,1,5,0],那么答案将是"15:10"。

我试过了,确实成功了,但它非常初级。我基本上必须为每个时间位置创建4个不同的数组,并与输入数组进行比较。

在任何语言(c, c#, objC或其他任何语言)中使用不同的方法实现将会有很大的帮助。我似乎无法理解我的逻辑。

只是想分享一个可行的解决方案。未必有效。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Test {
    public static void main(String[] args) throws Exception {
        int[] input = {1,2,6,7};
        System.out.println(getLargestTime(input)+" is the largest time!");
    }
    public static String getLargestTime(int[] input) {
        String largestTime = "00:00";
        String str = input[0]+""+input[1]+""+input[2]+""+input[3];
        List<String> times = new ArrayList<>();
        permutation(str, times);
        Collections.sort(times, Collections.reverseOrder());
        for (String t: times) {
            int hours = Integer.parseInt(t) / 100;
            int minutes = Integer.parseInt(t) % 100;
            if (hours < 24 && minutes < 60) {
                if (hours < 10 && minutes < 10) {
                    largestTime = "0"+hours+":0"+minutes;
                } else if (hours < 10) {
                    largestTime = "0"+hours+":"+minutes;
                } else if (minutes < 10) {
                    largestTime = hours+":0"+minutes;
                } else {
                    largestTime = hours+":"+minutes;
                }               
            }
        }
        return largestTime;
    }
    public static void permutation(String str, List<String> list) { 
        permutation("", str, list); 
    }
    private static void permutation(String prefix, String str, List<String> list) {
        int n = str.length();
        if (n == 0) list.add(prefix);
        else {
            for (int i = 0; i < n; i++)
                permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n), list);
        }
    }
}
  1. 查找最大数
  2. 如果该数字是合法的,则将其放在前面(0,1或2在第一个位置)。如果不是,找到最大的合法数字并把它放在第一位。
  3. 重复1-2,以第二个,第三个等最大的数字,直到找到一个合法的号码为前面
  4. 依次重复1-3
  5. 如果最后得到非法数字,那么将这些非法数字与产生最新时间的较早的数字交换。

由于只有4个数字,我将生成所有可能的时间戳(即4!24),对它们进行排序,并找到最大的有效时间戳。

如何查看t是否为有效的24小时时间戳?

  • t为最大4位,即t mod 10000 == 0
  • 最后两位数字(t mod 100)是有效的分钟值,即在[0-59]
  • 范围内
  • 前两位数字(t div 100)是有效的小时值,即在[0-23]
  • 范围内。

这不是完整的答案,只是@arun的补充部分。为了检查有效的时间戳,我假设时间戳的形式是ab:cd,其中a, b, c, d是数字。

  • a的取值范围为0 ~ 2

  • 如果a小于2,则b全部有效。否则,b取值范围为0 ~ 3

  • c的取值范围应为0 ~ 5

  • d都有效

你可以使用这些约束:

  • 检查生成后的有效时间戳或
  • 使用它们生成

相关内容

最新更新