从数字生成时间

时间:2017-01-25 21:12:21

标签: java algorithm

我的数字为x,y,z和w。 我试图以24小时格式创建最大可能时间。 例如:

我的方法是对所有数字进行排序。然后几个小时检查小于等于2的数字,然后检查小时的下一个数字,检查小于等于4的数字, 等等几分钟。 (0-60分钟)

除了暴力解决方案之外还有其他任何有效的方法吗?

6 个答案:

答案 0 :(得分:4)

简单的方法是创建四位数的所有数字的所有可能组合。然后排序并挑选出小于2359的所有值(允许的最大时间)。在此之后,您从最大数字开始,如果没有检查下一个最大数字,只需验证它是否是正确的时间。

答案 1 :(得分:3)

基本上你可以做的不是所有的排列,而是为数组中的每个值创建条件。例如,如果我们有一个2,我们知道我们的十个小时的小时应该是2,但我们那小时的小时点在这一点上只能是3。如果我们有一个1然后我们知道我们的小时的一个点可以是9.我们知道我们的十分钟点是5而我们的最大分钟一个点是9. createTime显示这些条件。如果findMaxSpecific无法在给定数组中找到有效数字,则返回-1。这样我们就知道如果我们得到一个带有-1的createTime返回的数组,那么时间就是无效的。参见示例输出。

library(dplyr)
df %>% select(ClaimDay, day) %>% 
     group_by(day) %>% 
     mutate(ClaimDay.count = n()) %>% 
     slice(1)

最后,如果任何值返回为-1,我们知道我们的时间无效

实施例

public static int[] createTime(int[] numbers)
{
    int[] time = new int[4];
    time[0] = findMaxSpecific(numbers, 2);
    time[1] = time[0] == 2 ? findMaxSpecific(numbers, 3) : findMaxSpecific(numbers, 9);
    time[2] = findMaxSpecific(numbers, 5);
    time[3] = findMaxSpecific(numbers, 9);

    return time;
}

public static int findMaxSpecific(int[] arr, int valToFind)
{
    if(arr.length != 4)
        return -1;

    int numToFind = -1; 
    int indexToRemove = -1;


    for(int i = 0; i < arr.length; i++)
    {
        if(arr[i] <= valToFind)
        {
            if(arr[i] > numToFind)
            {
                numToFind = arr[i];
                indexToRemove = i;
            }
        }
    }

    if(indexToRemove == -1)
        return -1;

    arr[indexToRemove] = -1;

    return numToFind;
}

输出

        int[] time = new int[4];
        int[] numbers = {1,2,3,4};
        time = createTime(numbers);
        System.out.println(time[0] + "" + time[1] + ":" + time[2] + "" + time[3]);
        int[] numbers2 = {0,9,7,1};
        time = new int[4];
        time = createTime(numbers2);
        System.out.println(time[0] + "" + time[1] + ":" + time[2] + "" + time[3]);

        int[] numbers3 = {9,9,9,9};
        time = new int[4];
        time = createTime(numbers3);
        System.out.println(time[0] + "" + time[1] + ":" + time[2] + "" + time[3]);

答案 2 :(得分:2)

对于输入1 2 9 9,唯一的可能性是19:29,但您描述的内容首先选择两个并获取21:99,这是一个无效的时间。

除非这确实是瓶颈而不是编程练习,否则最直接的解决方案是尝试所有可能的数字排列,对于每个数字,检查它是否构成有效时间,并采用字典编码最大有效字符串。 / p>

重点是,有快速的解决方案,并有正确的解决方案。 在这里,快速解决方案很棘手,因此如果程序运行时间不重要,请考虑选择较慢但更明显的解决方案的可能性。 作为一名程序员,这可能会让你有更多的时间来解决运行时间很重要的其他问题。

可悲的是,Java似乎没有提供内置的nextPermutation方法,而是Stackoverflow sure does

答案 3 :(得分:1)

input = (1,2,3,4)
ans = None
for hour in range(0, 24):
    for minute in range(0,60):
        if possible(hour, minute, input):
            ans = "%s:%s" % (hour, minute)

此处您的possible函数应计算小时,分钟和输入中的数字,并确保它们等同。

答案 4 :(得分:0)

我会有一个方法,你可以给出一个谓词,它提取与谓词匹配的最高值。

e.g。

public static int highest(List<Integer> values, Predicate<Integer> test) {
    Integer max = values.stream()
                        .filter(test)
                        .max(Comparator.natrualOrder())
                        .orElseThrow(() -> new InvalidStateException());
    values.remove(max);
    return max;
}

int digit1 = highest(list, i -> i < 3);
int digit3 = highest(list, i -> i < 6);
int digit2 = highest(list, i -> digit1 < 2 || i < 4);
int digit4 = highest(list, i -> true);

答案 5 :(得分:0)

有趣的问题。似乎比它看起来更复杂一些。这是问题的python脚本。

def getmin(num):   # check if two digits are valid for minutes
    min = -1
    sum = num[0] * 10 + num[1]
    if sum < 60:
        min = sum
    sum = num[1] * 10 + num[0]
    if sum < 60 and min < sum:
        min = sum
    return min

def maxtime(num):
    hour = -1
    min = -1
    h1 = 0
    h2 = 0
    for i in range(4):
        for j in range(4):  # these two loops are to get maxi hour, if possible
             if i != j:
                 sum = num[i] * 10 + num[j]
                 if hour < sum and sum < 24:
                     c = num[:]     # get a copy of input digits
                     if i > j:      # delete numbers used in hour
                         del c[i]
                         del c[j]
                     else:
                         del c[j]
                         del c[i]
                     if getmin(c) > -1: 
                         h1 = i
                         h2 = j
                         hour = sum
    if hour > -1:
        if h2 > h1:      # delete numbers used in hour
            del num[h2]
            del num[h1]
        else:
            del num[h1]
            del num[h2]

        min = getmin(num)

        if min > -1:
            print(str(hour) + ':' + str(min))

    if hour < 0 or min < 0:
        print("no solution")

maxtime([4, 8, 1, 9])
maxtime([7, 3, 4, 2])
maxtime([9, 2, 2, 5])
maxtime([9, 2, 7, 3])

#19:48
#23:47
#22:59
#no solution