转换为int并添加到列表中的数字字符串(优化问题)

2024-10-03 09:08:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经设法使代码工作,但我相信它可以优化。。。很多

输入是一个用空格分隔的数字字符串。类似于-4 2 8 61 2 3 4 5 6 7的东西

它必须找到与此condition a + b == c匹配的3个数字。虽然'b'始终位于'a'的右侧,并且for every time the condition is met在控制台上以以下格式打印数字-'a + b == c'。如果没有任何匹配项,请打印“否”

唯一的限制是'b'距离'a'至少有一个索引

这就是我想到的

lineOfNums = input('Line of numbers: ') # User input: example - 4 2 6 8
arrNums = lineOfNums.split()
conMet = False # Is the condition met at least once

for a in range(0, len(arrNums)):
    for b in range(a + 1, len(arrNums)):
        for c in range(0, len(arrNums)):
            if int(arrNums[a]) + int(arrNums[b]) == int(arrNums[c]):
                print(f'{arrNums[a]} + {arrNums[b]} == {arrNums[c]}')
                conMet = True

if conMet == False: print('No')

Tags: theinfalseforinputlenifrange
2条回答

首先,在创建arrNum时进行一次整数转换,而不是每次都通过循环

arrNum = [int(x) for x in lineOfNums.split()]

外部循环只需要转到len(arrNums)-1,因为它需要为它右边的B留出空间

for a in range(0, len(arrNums)-1):
    for b in range(a + 1, len(arrNums)):
        for c in range(0, len(arrNums)):
            if arrNums[a] + arrNums[b] == arrNums[c]:
                print(f'{arrNums[a]} + {arrNums[b]} == {arrNums[c]}')
                conMet = True

你可以用itertools来做,当然首先要转换成int

from itertools import combinations

# Convert to int
arr= [int(i) for i in arrNums]

# Get all the combinations
psums = {sum(i): i for i in combinations(arr, 2)}

# Then loop once
for i, v in enumerate(arr):
    if v in psums:
        print(f'{psums[v][0]} + {psums[v][1]} == {v}')

此算法的大O平均为O(n^2),它来自O(n choose r),其中n是输入的数量(本例中为4),而r是求和的数字计数,在本例中为2

相关问题 更多 >