如果条件不满足则打印一行
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)]
首先列出您的约束条件!
- 添加的号码必须是唯一的
- 只能加2个号码
- 数组长度可以任意
- 求和的数字可以是任意的
& 不要跳过预处理!减少你的问题-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 想要看到的那种东西。
你好 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)]
首先列出您的约束条件!
- 添加的号码必须是唯一的
- 只能加2个号码
- 数组长度可以任意
- 求和的数字可以是任意的
& 不要跳过预处理!减少你的问题-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 想要看到的那种东西。