2

需要一种算法来仅使用数字 0-9 以 DD/MM HH:MM:SS 格式查找最早的日期。实际答案是:26/03 17:48:59

4

2 回答 2

3

最简单的方法 - 生成 [0...9] 的所有排列并检查它们是否是有效日期。

10!= 3 628 800

如果你想提高效率,回溯会有所帮助。在这种情况下,它只是一个简单的约束满足问题,有效日期的数量远少于排列的数量。此外,您可以按最低月份、最低日等顺序考虑它们。

例如

01 不起作用,因为时间的第一个数字(10 小时)需要为 0 或 1 02 不起作用,因为时间的第一个数字现在必须为 1,日期只能是 0,1,2 in二月。

等等。

FWIW - 只有 769 个有效日期

import datetime
import itertools

count = 1
for perm in itertools.permutations( range(10) ):

    i = 0;
    day = perm[i]+perm[i+1]*10
    i+=2
    month = perm[i]+perm[i+1]*10
    i+=2
    hour =  perm[i]+perm[i+1]*10
    i+=2
    minute =  perm[i]+perm[i+1]*10
    i+=2
    second =  perm[i]+perm[i+1]*10
    try:
        print datetime.datetime( 2012, month, day, hour, minute, second)
        count+=1
    except:
        pass

print count
于 2012-05-08T19:20:51.897 回答
1

这是一个约束满足问题。您可能希望先使用日期格式 MM/DD HH:MM:SS,然后再转换您的答案。在这种格式中,字典上最小的有效日期字符串将是您寻找的答案,因此如果您系统地搜索,您找到的第一个有效日期将是解决方案。

本质上,您的搜索空间有 12 x 31 x 24 x 60 x 60 的大部分有效日期。因此,您的约束包括:

month < 13
day   < 32
hour  < 24
minutes < 60
seconds < 60
occurrence(date, i) == 1 for each i = 0 to 9

然后,您可以使用回溯搜索算法系统地在搜索空间中进行。

于 2012-05-09T13:33:33.083 回答