有没有一种pythonic的方法来计算总计整分钟的对

时间:2020-01-02 19:43:02

标签: python-3.x counting

我正在尝试查找持续时间加起来长达一整分钟的成对歌曲。给定示例的歌曲长度[10、50、90、30]。计算不同对的总数。我期望第一和第二对达到60秒,第三和第四对达到120秒,因此返回2。但是我却得到了一对。

def pair_with_target_sum(songs, k):
    n = len(songs)
    count = 0
    for i in range(0, n):
        for j in range(i + 1, n):
            if songs[i] + songs[j] == k:
                count += 1
    return count

def main():
    print(pair_with_target_sum([10, 50, 90, 30], 60))
    print(pair_with_target_sum([30, 20, 150, 100, 40], 60))

main()

3 个答案:

答案 0 :(得分:3)

有不同且更简单的算法:

  1. 创建具有60个存储桶的数组。
  2. 对于列表中的每个value,运行counts[value % k] += 1
  3. 总和min(counts[n], counts[(n + k) % k])(奇怪的计算而不是仅使用k - n就是为了处理特殊情况0

答案 1 :(得分:1)

我将itertools.combinationsmodulo operator结合使用:

from itertools import combinations

def f(songs):
    count = 0
    for pair in combinations(songs, 2):
        if sum(pair) % 60 == 0:
            count += 1

    return count

答案 2 :(得分:0)

您只需更改一行并从函数定义中删除k参数即可使代码正确工作,如下所示:

    def pair_with_target_sum(songs):
    n = len(songs)
    count = 0
    for i in range(0, n):
        for j in range(i + 1, n):
            if (songs[i] + songs[j]) % 60 == 0:
                count += 1
    return count

def main():
    print(pair_with_target_sum([10, 50, 90, 30]))
    print(pair_with_target_sum([30, 20, 150, 100, 40]))
    print(pair_with_target_sum([60, 60, 60]))

main()

当我用不同的输入运行代码时,这对我来说是正确的。

相关问题