如果条件不满足则打印一行

Print a line if conditions have not been met

你好 Whosebugers,我正在练习 Python 给我的一个示例问题(实际上是一个 Google 面试练习题)和 运行 一个我不知道的问题如何 a) 正确摆姿势(因此标题模糊),b) 克服。

问题是:对于一个数字数组(给定或 运行dom),在数组中找到唯一的数字对,将其相加得到一个给定的数字。例如:在下面的数组中找到加起来为 6 的数字对。

[1 2 4 5 11] 

所以在上面的例子中:

[1,5] and [2,4]

我写的代码是:

from secrets import *

i = 10

x = randbelow(10)

number = randbelow(100) #Generate a random number to be the sum that we are after#

if number == 0:
        pass
else:
        number = number

array = []

while i>0: #Generate a random array to use#
        array.append(x)
        x = x + randbelow(10)
        i -= 1

print("The following is a randomly generated array:\n" + str(array))
print("Within this array we are looking for a pair of numbers which sum to " + str(number))

for i in range(0,10):
        for j in range(0,10):
                if i == j or i>j:
                        pass
                else:
                        elem_sum = array[i] + array[j]
                        if elem_sum == number:
                                number_one = array[i]
                                number_two = array[j]
                                print("A pair of numbers within the array which satisfy that condition is: " + str(number_one) + " and " + str(number_two))
                        else:
                                pass

如果没有找到对,我想要行 "No pairs were found"。我在想 try/except,但不确定它是否正确或如何实现它。另外,我不确定如何停止出现重复的对(仅限唯一对),例如,如果我想要 22 作为总和并拥有数组:

[7, 9, 9, 13, 13, 14, 23, 32, 41, 45]

[9,13] would appear twice

如果有redundancies/the代码写得不是很高效,最后请见谅,我正在慢慢学习,所以任何其他提示将不胜感激!

感谢阅读:)

您可以简单地添加一个包含 "was at least one pair found?" 答案的布尔值。

在代码开头将其初始化为 found = false

然后,只要找到一对(包含当前 print 命令的条件块),只需添加 found = true.

完成所有搜索(双 for 循环`)后,添加:

if not found:
    print("No pairs were found")

不必实际比较每对数字,您可以只迭代列表一次,从目标数字中减去当前数字,然后查看余数是否在列表中。如果您首先将列表转换为 set,则可以在 O(1) 中完成查找,从而将整体复杂度从 O(n²) 降低到仅 O(n)。此外,整个事情可以通过列表理解在一行中完成:

>>> nums = [1, 2, 4, 5, 11]    
>>> target = 6    
>>> nums_set = set(nums)
>>> pairs = [(n, target-n) for n in nums_set if target-n in nums_set and n <= target/2]
>>> print(pairs)
[(1, 5), (2, 4)]

要打印对或某些消息,您可以使用 or 关键字。 x or y 被解释为 x if x else y,因此如果结果集为空,则打印消息,否则打印结果集本身。

>>> pairs = []    
>>> print(pairs or "No pairs found")
No pairs found

更新:如果添加到自身的数字等于目标,但在集合中只包含一次,则以上可能会失败。在这种情况下,您可以使用 collections.Counter 而不是 set 并首先检查该数字的重数。

>>> nums = [1, 2, 4, 5, 11, 3]
>>> nums_set = set(nums)
>>> [(n, target-n) for n in nums_set if target-n in nums_set and n <= target/2]
[(1, 5), (2, 4), (3, 3)]
>>> nums_counts = collections.Counter(nums)
>>> [(n, target-n) for n in nums_counts if target-n in nums_counts and n <= target/2 and n != target-n or nums_counts[n] > 1]
[(1, 5), (2, 4)]

首先列出您的约束条件!

  1. 添加的号码必须是唯一的
  2. 只能加2个号码
  3. 数组长度可以任意
  4. 求和的数字可以是任意的

& 不要跳过预处理!减少你的问题-space.

2 件事立即完成:

从你的 2 个打印语句开始,我会做 array = list(set(array)) 来减少问题 - space 到 [7, 9, 13, 14, 23, 32, 41, 45]

假设所有有问题的数字都是 正数,我会舍弃 number 以上的数字。 :
array = [x for x in array if x < number] 给予 [7, 9, 9, 13, 13, 14]

将最后 2 个步骤组合成列表理解,然后将其用作 array:

smaller_array = [x for x in list(set(array)) if x < number]

这给出 array == [7, 9, 13, 14]

完成这两个步骤后,您可以做很多事情。我完全知道我还没有回答你的问题,但从这里你得到了这个。 ^这是我认为 google 想要看到的那种东西。