在Python中找到下一个最接近的时间

时间:2018-02-10 13:35:29

标签: python algorithm date data-structures time

我有一个问题,我必须找到下一个最近的时间,其中给定时间的格式为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进行初始化。

任何帮助都会很棒。此外,欢迎任何更好的方式。感谢。

1 个答案:

答案 0 :(得分:1)

确实,在您将time分配给ans后,您将继续更改time元素的内容。这些元素与您在ans中看到的相同,因为anstime引用相同的列表。

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)
    }
}