目的是在HH:MM:SS格式中形成最大可能的时间,使用给定的九位数字中的任意六位(不一定不同),例如0、0、1、3、4、6、7、8、9,可以在24小时时间格式HH:MM:SS中形成许多不同的时间,例如17:36:40或10:30:41,只使用每一位数字一次。目标是找到最大可能的有效时间(00:00:01至24:00:00:00),该时间可以使用九位数字中的大约六位数形成一次。在这种情况下,是19:48:37。输入格式由9(不一定不同)的单数序列组成的一行(0-9中的任何一位),用逗号隔开。该序列将是不减少的输出,在24小时时钟(00:00:01至24:00:00)中的最大可能时间是一个HH:MM:SS表单,它可以使用九个给定数字中的大约六个(任意顺序)精确地每一次形成一次。如果没有任何六位数的组合将构成有效时间,则输出应该是“不可能解释”的单词--例如1输入0,0,1,1,3,6,7,7输出17:57:36解释:在一个24小时时钟中,可用大约6位数字中的6位精确一次形成的最大有效时间是17:57:36。
例2输入3,3,3,3,3,3,3,3输出不可能解释:没有一组来自输入的六位数可以用来形成有效时间。
def bubbleSort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] < arr[j+1] :
arr[j], arr[j+1] = arr[j+1], arr[j]
seq_a=list(map(int,input().split(',')))
# print(seq_a)
bubbleSort(seq_a)
# print(seq_a)
hrs=[None,None]
mins=[None,None]
secs=[None,None]
#hrs
for x in seq_a:
if x <= 2:
hrs[0]=x
seq_a.remove(x)
break
# print(seq_a)
# print(hrs,mins,secs)
if hrs[0]:
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(hrs,mins,secs)
#mins
if hrs[1]:
for x in seq_a:
if x < 6:
mins[0]=x
seq_a.remove(x)
break
# print(seq_a)
# print(hrs,mins,secs)
if mins[0]:
for x in seq_a:
if x <= 9:
mins[1]=x
seq_a.remove(x)
break
# print(seq_a)
# print(hrs,mins,secs)
#secs
if mins[1]:
for x in seq_a:
if x < 6:
secs[0]=x
seq_a.remove(x)
break
# print(seq_a)
# print(hrs,mins,secs)
if secs[0]:
for x in seq_a:
if x <= 9:
secs[1]=x
seq_a.remove(x)
break
# print(seq_a)
# print(hrs,mins,secs)
if secs[1]:
print(str(hrs[0])+str(hrs[1])+':'+str(mins[0])+str(mins[1])+':'+str(secs[0])+str(secs[1]))
else:
print('Impossible')发布于 2018-07-27 19:31:29
您的程序会产生以下错误结果:
0,5,5,5,5,5,5,5,9→Impossible (应该是09:55:55) 0,2,5,5,5,5,5,5,5→Impossible (应该是20:55:55)由于测试(如if hrs[0]、if hrs[1]、if mins[1]和if secs[1] ),小时、分钟或秒是10的倍数,或者如果时间以0开头。2,2,4,4,4,4,4,4,7→24:47:44 (应该是22:47:44)挑战声明24:00:00是上限。正确的答案,22:47:44,表明天真的贪婪算法不足以解决这个问题。您可以乐观地为小时选择24 (这将适用于输入,如0,0,0,0,2,4,9,9,9)。但是,对于输入的2,2,4,4,4,4,4,4,7,如果选择24作为小时,您应该会发现没有有效的分钟,您需要回溯并尝试该小时的22。不需要实现bubbleSort。打给sorted(seq_a, reverse=True)就行了。(根据PEP 8命名约定,函数应该命名为bubble_sort。)
您的代码是重复的:编写一个类似的for循环来处理六位数字中的每一位。您应该将它们概括为由一个循环处理,该循环接受每个数字的不同上限。请注意,大多数循环都使用<=测试,但对于某些循环使用< 6 --这种不一致性令人困惑。
我将定义一个placewise_max函数来概括所有的循环,然后用三个限制模板字符串调用它。不过,我不会使用带有break语句的循环,而是使用next()带有生成器表达式。
注意,不需要将每个字符解析为数字数字: ASCII比较也同样有效。
def placewise_max(max_template, pool):
"""
Try to form the lexicographically greatest string from the characters in
the pool, where the character in each position of the output does not
exceed the character at the corresponding position in the template.
Return the empty string if any position cannot be filled.
>>> placewise_max('91210', list('02301'))
'31200'
>>> placewise_max('elmo', 'abcdefghijklm')
'elmk'
>>> placewise_max('elmo', 'limo')
''
"""
pool = sorted(pool, reverse=True)
output = []
try:
for t in max_template:
char = next(c for c in iter(pool) if c <= t)
pool.remove(char)
output.append(char)
return ''.join(output)
except StopIteration: # next() failed to pick from the pool
return ''
def max_time(digits):
best = max(
placewise_max('240000', digits),
placewise_max('235959', digits),
placewise_max('195959', digits)
)
if best and (best != '000000'):
return '{0}{1}:{2}{3}:{4}{5}'.format(*best)
if __name__ == '__main__':
print(max_time(input().split(',')) or 'Impossible')上面的解决方案使用了一些相当先进的技术,对于初学者来说可能是压倒性的。然而,我要指出一个重要的下一步,以提高您的编码技能。
学习编写函数(每个函数都有明确定义的目的)、接受参数、返回结果和不使用全局变量是至关重要的。像我所做的那样,在docstring中记录目的、参数和输出。这将迫使您将代码打包成小的、可重用的块。例如,您是否可以编写一个函数,接受一个字符串(或列表)字符,并返回一个包含两个项的元组--从这些字符中可以形成的最佳时间,以及所有未用于形成时间的剩余字符?
正确地解决这个问题需要定义一个函数,因为正如我前面所指出的,正确的解决方案需要一些尝试和错误。
发布于 2018-07-28 08:49:19
200_success为如何使解决方案更好提供了一些很好的技巧,但是我建议您在解决方案中使用python的强大功能。当然,它不会像可能的那样快,但是如果你在寻找速度,你可以使用其他语言。
因为我们处理的是数字的排列,所以我们可以使用itertools来生成所有的排列。而且,由于我们处理的时间,我们可以使用datetime.datetime和datetime.time。
这个想法很简单:让itertools生成长度为6的所有排列,让datetime检查它们是否是有效的时间字符串。
import itertools
from datetime import datetime
inp = [0,9,5,5,5,5,5,5,5]
form = "%H:%M:%S"
possible = False
max_time = datetime.strptime("00:00:00", form).time()
for perm in itertools.permutations(inp, 6):
time_string = "%d%d:%d%d:%d%d" % perm
try:
time_object = datetime.strptime(time_string, form).time()
possible = True
max_time = max(time_object, max_time)
except: pass
if possible:
print(max_time)
else:
print("Impossible")这应该通过所有的测试用例,因为它实际上是为了处理所有的案例而设计的。如果这是一个面试问题,他们可能想让你实现你自己的东西,但这是我能想到的最重要的一种。
https://codereview.stackexchange.com/questions/200434
复制相似问题