我有一个问题,我必须找到下一个最近的时间,其中给定时间的格式为HH:MM。
我写了以下算法:
def nextClosestTime(time):
time = list(time)
c = (int(time[0])*10 + int(time[1]))*60 + int(time[3])*10 + int(time[4])
digits = [time[0],time[1],time[3],time[4]]
diff = 24*60
# there are 4 x 4 x 4 x 4 permutations
ans = []
ans = ans + time
one = [x for x in digits if int(x)<3]
two = [x for x in digits]
three = [x for x in digits if int(x)<6]
four = [x for x in digits]
for i in range(len(one)):
time[0] = one[i]
for j in range(len(two)):
time[1] = two[j]
if time[0]==2 and time[1]>4:
continue
for k in range(len(three)):
time[3] = three[k]
for l in range(len(four)):
time[4] = four[l]
t = (int(time[0])*10 + int(time[1]))*60 + int(time[3])*10 + int(time[4])
if t>c and t-c< diff:
diff = t-c
ans = time
return "".join(x for x in ans)
print(nextClosestTime("19:34"))
但是,我的答案是14:44,即使ans
仅在时间值为19:39时更新一次。
之后ans
永远不会更新,因为19:39具有最小diff
。那么,为什么ans
会改变?
这是python中的一些浅拷贝或深拷贝问题吗?
我是这么认为的,而不是仅仅在定义变量时执行ans = time
,而是ans = []
然后ans = ans + time
进行初始化。
任何帮助都会很棒。此外,欢迎任何更好的方式。感谢。
答案 0 :(得分:1)
确实,在您将time
分配给ans
后,您将继续更改time
元素的内容。这些元素与您在ans
中看到的相同,因为ans
和time
引用相同的列表。
将time
分配给ans
时,您需要复制 if t>c and t-c< diff:
diff = t-c
ans = time[:] # take a copy
:
19:39
现在你的功能将输出:
def nextClosestTime(time):
digits = [int(digit) for digit in time if digit.isdigit()]
uniques = sorted(set(digits))
pos = [uniques.index(digit) for digit in digits]
for i in range(3, -1, -1):
pos[i] += 1
if pos[i] < len(uniques):
digits[i] = uniques[pos[i]]
if digits[2] < 6 and digits[0]*10+digits[1] < 24:
return "{}{}:{}{}".format(*digits)
digits[i] = uniques[0]
return "no solution"
print(nextClosestTime("15:56")) # 16:11
更有效的算法首先检查哪个是唯一的数字列表,对它们进行排序并确定该排序列表中每个原始数字的位置。
然后,从最后一位开始,查找该排序列表中下一个可用数字的内容。如果有一个,并且结果时间有效,则将其作为解决方案返回。
如果它已经是排序列表中的最后一位数字,或者结果时间无效,请将该数字更改为最小可用值(排序列表中的第一个数字)。然后对剩余的数字重复上述步骤。
代码:
public var playerItems: [AVPlayerItem] = [] {
didSet {
self.audioPlayer = AVQueuePlayer(items: playerItems)
}
}