找到重复的数字

时间:2016-10-21 02:21:33

标签: python

给定包含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:

非常感谢您的帮助!谢谢。

5 个答案:

答案 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]fastnums[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

https://repl.it/ECZF/1

答案 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])