Python 如果不满足条件,则打印一行
大家好,stackoverflowers的同事们,我正在用一个给我的示例问题(实际上是一个Google面试练习问题)练习Python,遇到了一个我不知道如何a)正确摆姿势(因此标题模糊),b)克服的问题 问题是:对于一个数字数组(给定的或随机的),在数组中找到唯一的数字对,当求和时给出一个给定的数字。例如:在下面的数组中找到一对数字,将它们相加为6Python 如果不满足条件,则打印一行,python,if-statement,conditional-statements,statements,Python,If Statement,Conditional Statements,Statements,大家好,stackoverflowers的同事们,我正在用一个给我的示例问题(实际上是一个Google面试练习问题)练习Python,遇到了一个我不知道如何a)正确摆姿势(因此标题模糊),b)克服的问题 问题是:对于一个数字数组(给定的或随机的),在数组中找到唯一的数字对,当求和时给出一个给定的数字。例如:在下面的数组中找到一对数字,将它们相加为6 [1 2 4 5 11] 因此,在上述情况下: [1,5] and [2,4] 我写的代码是: from secrets import *
[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
如果没有找到对,我希望行“没有找到对”。我想尝试一下,但不确定它是否正确或如何实现。此外,我不确定如何阻止重复对出现(仅限唯一对),因此,例如,如果我想要22作为一个和,并拥有数组:
[7, 9, 9, 13, 13, 14, 23, 32, 41, 45]
[9,13] would appear twice
最后,如果有冗余,请原谅我/代码编写效率不高,我正在慢慢学习,因此任何其他提示都将不胜感激
感谢阅读:)您只需添加一个布尔值,其中包含“是否找到了至少一对?”的答案 在代码开头将其初始化为
found=false
然后,只要找到一对(保存当前print
命令的条件块),只需添加found=true
在所有搜索(双循环`)之后,添加以下内容:
if not found:
print("No pairs were found")
不必实际比较每一对数字,只需迭代列表一次,从目标数字中减去当前数字,然后查看剩余数字是否在列表中。如果首先将列表转换为集合
,则可以在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)]
更新:如果添加到自身的数字等于目标,但在集合中仅包含一次,则上述操作可能会失败。在这种情况下,您可以使用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)]
nums=[1,2,4,5,11,3]
>>>nums_set=set(nums)
>>>[(n,target-n)表示nums_集中的n,如果target-n表示nums_集中的n,并且n>>nums_计数=集合。计数器(nums)
>>>[(n,target-n)表示nums_中的n计数,如果nums_中的target-n计数,则为n1]
[(1, 5), (2, 4)]
首先列出您的约束条件!
array=list(set(array))
将问题空间减少到[7,9,13,14,23,32,41,45]
假设所有有问题的数字都是正数,我会放弃上面的数字:number
:array=[x表示数组中的x,如果x
给出[7,9,9,13,13,14]
将最后两个步骤组合成一个列表理解,然后将其用作array
:
较小的数组=[x代表列表中的x(设置(数组)),如果x
它给出了数组==[7,9,13,14]
在这两个步骤之后,你可以做很多事情。我完全知道我还没有回答你的问题,但从这里你得到了这个问题。^这是我认为谷歌想要看到的东西。1。如果你在代码2中修复缩进,人们会更容易帮你。完成这一点的简单方法是创建一个名为d
找到
并将其设置为假
-然后,如果触发了如果elem_sum==number:
,则编写一行代码,将找到的
更改为真
@n1c9“修复缩进”这不是很有帮助,缩进是完全有效的。这里有一点改进:不用检查i==j或i>j
,你可以在范围(j+1,10)中为j使用。一些更好的解决方案:1.排序并使用两个指针(一个从开始,一个从结束),时间复杂度O(nlogn).2.使用字典,将目标-currentValue
存储为键.O(n)@丁:是的,这是我最初的想法,但我不知道如何使用Python。不过,感谢你的指点,我将以不同的方式重新审视这个问题!这是一个非常简单的解决方案,我学到了一些新的东西。谢谢你!很高兴。另外,我知道这不是你最初问题的一部分,但你也可以创建一个X随机数列表的一部分,该列表更短、更容易理解(如果您理解以下语法):random\u nums=[randbown(10)for num in range(10)]
。这本质上意味着您要创建一个列表,在该列表中,您要迭代range(10)
的每个元素(在本例中,这只意味着迭代10次),然后,在每次迭代中,执行randbown(10)
。谢谢你,这是非常有见地的。我目前正在尝试加强我的申请,以申请CompSci硕士课程(来自工程)因此,解决这些问题,并看到类似于您的简洁解决方案,是一个非常有用的知识工具!但是如果您不介意,请您解释一下更新的第3行(/4行)好吗
>>> 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)]