给定包含n + 1个整数的数组nums,其中每个整数在1和n之间(包括1和n),证明必须存在至少一个重复的数字。假设只有一个重复的数字,找到重复的数字。
我的解决方案:
def findDuplicate(nums):
slow = fast = finder = 0
while fast is not None:
slow = nums[slow]
fast = nums[nums[fast]]
if fast is slow:
return slow
return False
nums = [1,2,2,3,4]
print findDuplicate(nums)
我的上述解决方案有效并且给了我o / p 2,但它并不适用于所有输入,例如它不适用于[11,15,17,17,14]
或[3,1,2,6,2,3]
并给我错误IndexError:列表索引超出范围。我无法找到模式,也无法找到确切的问题。还试图改变我的条件:
while fast is not None and nums[nums[fast]] is not None:
非常感谢您的帮助!谢谢。
答案 0 :(得分:2)
由于数字介于1和n
之间并且您被告知只有一个副本,您可以使用数组中数字之和与1到{{1之间的数字之和获取副本。
n
因此副本是列表的总和 - n *(n + 1)/ 2
当然,这并不能概括为任何列表查找重复项。对于这种情况,你需要使用@Jalepeno112的答案。
答案 1 :(得分:1)
第一个有效的事实是侥幸。让我们来看看它在第一遍中的作用。
nums = [1,2,2,3,4]
# slow starts as index 0. So now, you've reassigned slow to be nums[0] which is 1.
# so slow equals 1
slow = nums[slow]
# now you are saying that fast equals nums[nums[0]].
# nums[0] is 1. nums[1] is 2
# so fast = 2
fast = nums[nums[fast]]
在下一个传递中,慢nums[1]
为fast
,nums[nums[2]]
为nums[2]
,slow
为2.此时{{1} }和fast
相等。
在第二个示例中,由于IndexError
,您获得fast = nums[nums[fast]]
如果nums[fast]
处的值不是有效索引,则此代码将失败。具体来说,在第二个示例中,nums[0]
为11. nums
在索引11处没有元素,因此您会收到错误。
您真正想要做的是在阵列上执行嵌套for循环:
# range(0,len(nums)-1) will give a list of numbers from [0, to the length of nums-1)
# range(1, len(nums)) does the same,
# except it will start at 1 more than i is currently at (the next element in the array).
# So it's range is recomputed on each outer loop to be [i+1, length of nums)
for i in range(0,len(nums)-1):
for j in range(i+1,len(nums)):
# if we find a matching element, return it
if nums[i] == nums[j]:
return nums[i]
# if we don't find anything return False
return False
可能还有其他更多的Pythonic方法可以实现这一目标,但这不是你原来的问题。
答案 2 :(得分:0)
首先,您必须确保列表中的所有数字都满足您的约束。
在列表中查找重复的数字使用Counter
中的collections
,它将返回每个数字和出现次数示例:
>>> from collections import Counter
>>> l=Counter([11,15,17,17,14])
>>> l
Counter({17: 2, 11: 1, 14: 1, 15: 1})
获得最常见的用途:
>>> l.most_common(n=1)
[(17, 2)]
其中n是您想要获得的最常见数字
答案 3 :(得分:0)
def findDuplicate(num):
x = sorted(l)
y = x[0]
for n in x[1:]:
if y == n:
return n
y = n
计算上浪费的答案让我感到难过。几秒钟内100K次迭代:
0.762:Counter
@HishamKaram
0.342:双for
循环@Jalepeno112
0.097:sorted
for
@Ouroborus
0.043:魔术@Munir
答案 4 :(得分:0)
def duplicates(num_list):
if type(num_list) is not list:
print('No list provided')
return
if len(num_list) is 0 or len(num_list) is 1:
print('No duplicates')
return
for index,numA in enumerate(num_list):
num_len = len(num_list)
for indexB in range(index+1, num_len):
if numA == num_list[indexB]:
print('Duplicate Number:'+str(numA))
return
duplicates([11,15,17,17,14])
duplicates([3,1,2,6,2,3])
duplicates([])
duplicates([5])