【问题标题】:Form the maximum possible date time in the MM/DD HH:MM format using any eight of twelve given single digits使用 12 个给定个位数中的任意 8 个,以 MM/DD HH:MM 格式形成最大可能的日期时间
【发布时间】:2018-08-16 16:19:16
【问题描述】:

我为下面的问题陈述编写了一个代码,它适用于大多数输入。但它不适用于像 1,1,1,1,1,1,1,3 这样的输入。答案应该是 11/13 11:11 但它返回 0(这意味着它找不到有效的日期)。我明白为什么会发生这种情况,但我找不到解决方案。

问题描述:

Arun 和他的妹妹 Usha 正在互相挑战 数学难题。更聪明的乌莎想出了 给阿伦从 0 到 9 的 12 个不同数字,并让他形成 2018 年与他们最大的约会时间。阿伦有点紧张, 要求你帮助他完成一个计算机程序。乌莎会给阿伦 12 不同的数字。他需要在 2018 年:MM/DD 表格中的日期(所有四位数字必须是 存在),以及格式为 HH:MM 的时间(所有四位数字必须是 当下)。日期可能从 01/01 到 12/31,时间可能从 00:00 至 23:59(24 小时制)。提供的数字可能是 在 Arun 给出的答案中只使用过一次。如果超过一个日期 可能形成时间组合,Arun 需要给出最新的有效 日期时间可能在 2018 年。

约束

个位数(0-9 中的任何一个)

输入格式

由 12 个序列组成的行(不一定不同) 用逗号分隔的单个数字(0-9 中的任何一个)。序列将是 不减少。

输出

2018 年可能的最大有效日期时间。输出必须 格式为 MM/DD HH:MM 如果无法构造日期时间,则 输出应该是 0

说明

示例 1:

输入

0,0,1,2,2,2,3,5,9,9,9,9

输出

12/30 22:59

解释

给出了 Arun 使用的 12 位数字。最长有效日期 时间只使用给定的数字,并且每个数字最多使用 一次是 12/30 22:59 这是输出。


示例 2

输入

3,3,3,3,3,3,3,3,3,3,3,3

输出

0

解释

由于输入中不存在小于 3 的数字,因此不能使用有效月份 形成。因此,输入不能形成有效的日期时间 数字。

我的代码:

seq_a=list(map(int,input().split(',')))
# print(seq_a)
seq_a.sort(reverse=True)
# print(seq_a)
months=[None,None]
days=[None,None]
hrs=[None,None]
mins=[None,None]
#months
for x in seq_a:
    if x <= 1:
        months[0]=x
        seq_a.remove(x)
        break
if months[0] is not None:
    if months[0]==1:
        for x in seq_a:
            if x <= 2:
                months[1]=x
                seq_a.remove(x)
                break
    else:   
        for x in seq_a:
            if x>0 and x <= 9:
                months[1]=x
                seq_a.remove(x)
                break
# print(seq_a)
# print(months,days,hrs,mins)
#days
if months[1] is not None:
    month=int(str(months[0])+str(months[1]))
    # print(month)
    if month==2:
        for x in seq_a:
            if x <= 2:
                days[0]=x
                seq_a.remove(x)
                break
        if days[0] is not None:
            if days[0]==2:
                for x in seq_a:
                    if x <= 7:
                        days[1]=x
                        seq_a.remove(x)
                        break
            else:
                for x in seq_a:
                    if x <= 9:
                        days[1]=x
                        seq_a.remove(x)
                        break
    elif month<=7:
        if month%2==0:
            for x in seq_a:
                if x <= 3:
                    days[0]=x
                    seq_a.remove(x)
                    break
            if days[0] is not None:
                if days[0]==3:
                    for x in seq_a:
                        if x == 0:
                            days[1]=x
                            seq_a.remove(x)
                            break
                else:
                    for x in seq_a:
                        if x > 0 and x <= 9:
                            days[1]=x
                            seq_a.remove(x)
                            break
        else:
            for x in seq_a:
                if x <= 3:
                    days[0]=x
                    seq_a.remove(x)
                    break
            if days[0] is not None:
                if days[0]==3:
                    for x in seq_a:
                        if x <= 1:
                            days[1]=x
                            seq_a.remove(x)
                            break
                else:
                    for x in seq_a:
                        if x <= 9:
                            days[1]=x
                            seq_a.remove(x)
                            break
    else:
        if month%2==0:
            for x in seq_a:
                if x <= 3:
                    days[0]=x
                    seq_a.remove(x)
                    break
            if days[0] is not None:
                if days[0]==3:
                    for x in seq_a:
                        if x <= 1:
                            days[1]=x
                            seq_a.remove(x)
                            break
                else:
                    for x in seq_a:
                        if x <= 9:
                            days[1]=x
                            seq_a.remove(x)
                            break
        else:
            for x in seq_a:
                if x <= 3:
                    days[0]=x
                    seq_a.remove(x)
                    break
            if days[0] is not None:
                if days[0]==3:
                    for x in seq_a:
                        if x == 0:
                            days[1]=x
                            seq_a.remove(x)
                            break
                else:
                    for x in seq_a:
                        if x <= 9:
                            days[1]=x
                            seq_a.remove(x)
                            break
# print(seq_a)
# print(months,days,hrs,mins,"YOLO")
#hrs
if days[1] is not None:
    for x in seq_a:
        if x <= 2:
            hrs[0]=x
            seq_a.remove(x)
            break
# print(seq_a)
# print(months,days,hrs,mins)
if hrs[0] is not None:
    if hrs[0]==2:
        for x in seq_a:
            if x < 4:
                hrs[1]=x
                seq_a.remove(x)
                break
    else:   
        for x in seq_a:
            if x <= 9:
                hrs[1]=x
                seq_a.remove(x)
                break
# print(seq_a)
# print(months,days,hrs,mins)
#mins
if hrs[1] is not None:
    for x in seq_a:
        if x < 6:
            mins[0]=x
            seq_a.remove(x)
            break
# print(seq_a)
# print(months,days,hrs,mins)
if mins[0] is not None:
    for x in seq_a:
        if x <= 9:
            mins[1]=x
            seq_a.remove(x)
            break
# print(seq_a)
# print(months,days,hrs,mins)
if mins[1] is not None:
    print(str(months[0])+str(months[1])+'/'+str(days[0])+str(days[1])+' '+str(hrs[0])+str(hrs[1])+':'+str(mins[0])+str(mins[1]))
else:
    print(0)

【问题讨论】:

    标签: python algorithm date datetime


    【解决方案1】:

    问题是你没有回溯,你得到一个“3”作为天数的第一个数字,只剩下 1,第 11 个月没有第 31 个。

    因此此处不允许将“3”作为第一位数字,您需要在没有“3”的情况下重做月份的第一位数字并将其保留为下一位数字。

    【讨论】:

      【解决方案2】:

      重新阅读该问题后,我意识到您想知道为什么您的代码无法正常工作,而不是一般问题的解决方案,我深表歉意。将我的代码留在这里以备不时之需

      你可以使用回溯,但蛮力在这里似乎并没有什么问题

      考虑以下

      In [129]: import random
      
      In [130]: nums = [random.randint(1,3) for _ in range(0,9)]
      
      In [131]: pnums = [(i,j) for i in range(0,len(nums)) for j in range(0, len(nums)) if i is not j]
      
      In [132]: month = -1
      
      In [133]: m1 = -1
      
      In [134]: m2 = -1
      
      In [135]: len(pnums)
      Out[135]: 72        
      
      In [136]: nums
      Out[136]: [1, 1, 3, 1, 3, 2, 1, 3, 3]
      
      In [137]: month_candidates = ([ (i,j) for (i,j) in pnums if ((nums[i]*10)+nums[j]) < 13 ])
      
      In [138]: month_candidates
      Out[138]:                 
      [(0, 1),                  
       (0, 3),                  
       (0, 5),                  
       (0, 6),                  
       (1, 0),                  
       (1, 3),                  
       (1, 5),                  
       (1, 6),                  
       (3, 0),                  
       (3, 1),                  
       (3, 5),                  
       (3, 6),                  
       (6, 0),                  
       (6, 1),                  
       (6, 3),                  
       (6, 5)]                  
      
      In [139]: nums
      Out[139]: [1, 1, 3, 1, 3, 2, 1, 3, 3]
      
      In [140]: for (i,j) in month_candidates:
           ...:     if ((nums[i]*10)+nums[j]) > month:
           ...:         month = ((nums[i]*10)+nums[j])
           ...:         m1 = i                        
           ...:         m2  = j                       
           ...:                                       
      
      In [141]: m1
      Out[141]: 0 
      
      In [142]: m2
      Out[142]: 5 
      
      In [143]: month
      Out[143]: 12   
      
      In [144]: temp = [pnums.remove(p) for p in pnums if (m1 in p) or (m2 in p)] # Save some typing
      
      In [145]: len(nums)
      Out[145]: 9        
      
      In [146]: len(pnums)
      Out[146]: 50        
      
      In [147]: days = -1
      
      In [148]: d1 = -1
      
      In [149]: d2 = -1
      
      In [150]: day_candidates = ([ (i,j) for (i,j) in pnums if ((nums[i]*10)+nums[j]) < 31 ])
      
      In [151]: for (i,j) in day_candidates:
           ...:     if ((nums[i]*10)+nums[j]) > days:
           ...:         days = ((nums[i]*10)+nums[j])
           ...:         d1 = i                       
           ...:         d2  = j                      
           ...:                                      
           ...:                                      
      
      In [152]: days
      Out[152]: 23  
      
      In [153]: temp = [pnums.remove(p) for p in pnums if (d1 in p) or (d2 in p)] # Save some typing
      
      In [154]: len(pnums)
      Out[154]: 38        
      
      In [155]: hours = -1
      
      In [156]: h1 = -1
      
      In [157]: h2 = -1
      
      In [158]: hour_candidates = ([ (i,j) for (i,j) in pnums if ((nums[i]*10)+nums[j]) < 24 ])
      
      In [159]: for (i,j) in hour_candidates:
           ...:     if ((nums[i]*10)+nums[j]) > hours:
           ...:         hours = ((nums[i]*10)+nums[j])
           ...:         h1 = i
           ...:         h2  = j
           ...:
           ...:
      
      In [160]: hours
      Out[160]: 21
      
      In [161]: temp = [pnums.remove(p) for p in pnums if (h1 in p) or (h2 in p)] # Save some typing
      
      In [162]: len(pnums)
      Out[162]: 29
      
      In [163]: mins = -1
      
      In [164]: mi1 = -1
      
      In [165]: mi2 = -1
      
      In [166]: min_candidates = ([ (i,j) for (i,j) in pnums if ((nums[i]*10)+nums[j]) < 60 ])
      
      In [167]: for (i,j) in min_candidates:
           ...:     if ((nums[i]*10)+nums[j]) > mins:
           ...:         mins = ((nums[i]*10)+nums[j])
           ...:         mi1 = i
           ...:         mi2  = j
           ...:
           ...:
      
      In [168]: mins
      Out[168]: 33
      
      In [169]: print '{}/{} {}:{}'.format(month, days, hours, mins)
      12/23 21:33
      
      In [170]: nums
      Out[170]: [1, 1, 3, 1, 3, 2, 1, 3, 3]
      

      假设

      1. 没有强大的边缘情况检查
      2. 假设月份有 31 天(可通过使用地图查询月份来修复)
      3. 对从 1 到 3 的整数做了它(soln 对于 0 到 9 并没有太大的不同)

      说明

      我将指导您计算最佳月份。

      1. 首先使用给定整数列表生成所有索引数字对。
      2. 然后计算在源数组中查找并转换为 2 位整数时产生小于 13 的最大数的最大索引对
      3. 从未来考虑中删除索引
      4. 在适当的范围内对其他数量重复该过程(24 小时,30/31 天等)

      【讨论】:

      • 你知道我为什么被否决了吗?我一无所知。
      • 我认为这是因为您没有尝试在代码上运行调试器并尝试查明您的算法出错的地方。对于 SO 成员来说,仅在一个微不足道的程序中就很难为您查明错误。为了改进这个问题,我首先尝试使用调试器/打印 stmts 进行调试,并尝试找出你的 prog 中的逻辑中断的位置,然后将这些细节添加到问题中:)
      • 查看How to Ask,了解更多关于提出好问题的有用提示:)
      猜你喜欢
      • 2018-11-18
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多