Python 以MM/DD HH:MM格式,使用十二个给定单位数中的任意八个,形成可能的最大日期时间
我已经为下面的问题陈述编写了一个代码,它可以很好地用于大多数输入。但是它不适用于像1,1,1,1,1,1,1,3这样的输入。答案应该是11/13 11:11,但它返回0,这意味着它找不到有效的日期。我理解为什么会发生这种情况,但我找不到解决办法 问题描述: 阿伦和他的妹妹乌莎正在用一些技巧互相挑战 数学难题。更聪明的乌莎想出了 给文加伦12个不同的数字,从0到9,并让他形成一个新的想法 2018年与他们的最大约会时间。阿伦有点紧张,而且 请你帮他做一个电脑程序。Usha会给Arun 12个 不同的数字。他需要在列表中创建一个日期时间组合 2018年:MM/DD表格中的日期四位数字必须为 当前,且格式为HH:MM的时间所有四位数字必须为 目前日期可能从01/01至12/31,时间可能从 00:00至23:59,24小时制。提供的数字可以是 在阿伦给出的答案中只使用了一次。如果有多个日期 可能会形成时间组合,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的数字,因此无法输入有效月份 形成。因此,无法使用输入形成有效的日期时间 数字 我的代码:Python 以MM/DD HH:MM格式,使用十二个给定单位数中的任意八个,形成可能的最大日期时间,python,algorithm,date,datetime,Python,Algorithm,Date,Datetime,我已经为下面的问题陈述编写了一个代码,它可以很好地用于大多数输入。但是它不适用于像1,1,1,1,1,1,1,3这样的输入。答案应该是11/13 11:11,但它返回0,这意味着它找不到有效的日期。我理解为什么会发生这种情况,但我找不到解决办法 问题描述: 阿伦和他的妹妹乌莎正在用一些技巧互相挑战 数学难题。更聪明的乌莎想出了 给文加伦12个不同的数字,从0到9,并让他形成一个新的想法 2018年与他们的最大约会时间。阿伦有点紧张,而且 请你帮他做一个电脑程序。Usha会给Arun 12个 不同
问题是你没有回溯,你会得到一个“3”作为天数的第一个数字,只剩下1,第11个月没有第31个数字 因此,这里不允许将“3”作为第一个数字,您需要在没有“3”的情况下重做一个月的第一个数字,并将其保留到下一个数字。重新阅读此问题后,我意识到您想知道为什么您的代码不起作用,而不是一般问题的解决方案,我向您道歉。把我的代码留在这里以防万一 你可以使用回溯,但暴力在这里似乎并没有那么错 考虑下面的问题
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]
假设
没有可靠的边缘情况检查
假设月份有31天可以通过使用映射查询月份来修复
对1到3的整数执行此操作对于0到9,soln没有太大的不同
解释
我会带你去计算最好的月份
首先使用给定整数列表生成所有索引数字对。
然后计算最大索引对,当在源数组中查找并转换为2位整数时,该索引对产生小于13的最大数字
将指数从未来考虑中删除
对具有适当界限的其他数量重复该过程,24小时,30/31天等。
你知道我为什么会落选吗?我不知道。我想这是因为你没有尝试在你的代码上运行调试器,并试图找出你的算法哪里出了问题。对于SO成员来说,除了一个琐碎的程序之外,很难为您找出错误所在。为了改进这个问题,我将首先尝试使用调试器/print stmts进行调试,并尝试找出prog中的逻辑在哪里中断,然后将这些细节添加到问题中:查看有关提出好问题的更多有用提示:
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]