使用一组数字实现“24小时时间”

时间:2016-11-02 00:14:00

标签: algorithm sorting

我最近在考试中得到了一个问题。 我将获得一个包含4个数字的数组,并使用它我必须构建最大可能的24小时时间格式。 例如:如果输入数组为[1,3,5,2],则答案为“23:51”。  如果输入数组为[1,1,5,0],则答案为“15:10”。

我尝试过并且确实取得了成功,但这是非常简陋的。我基本上必须为每个时间位置制作4个不同的数组,并与输入数组进行比较。

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

4 个答案:

答案 0 :(得分:2)

只想分享一个有效的解决方案。不一定有效率。

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 :(得分:1)

  1. 查找最大数字
  2. 如果合法合法(第一个地点为0,1或2),请将该号码放在前面。如果不是,请找到最大的法定号码并放在第一位。
  3. 使用第二个,第三个等最大数字重复1-2,直到找到正面的合法号码
  4. 重复1-3,第二个到前,第二个到最后,最后一个
  5. 如果你最后以非法数字结尾,那么将这些非法数字换成产生最新时间的早期数字。

答案 2 :(得分:1)

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

如何检查t 24小时时间戳是否有效?

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

答案 3 :(得分:0)

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

  • a应为0到2

  • 如果小于2,则b全部有效。 否则,b应为0到3

  • c应该是0到5

  • d全部有效

您可以使用这些约束:

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