面试刷题之牛客网《数组中重复的数字》(习题详细解析及python实现)


 

题目链接:

数组中重复的数字
 

题干

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1
 

示例

input: [2, 3, 1, 0, 2, 5, 3]

output:2

or

output:3

思路详解

为了判断任意一个重复数字。其实就是直接看该数字之前有没有出现。又提示所有数字都在0到n-1之间且数组长n。那么,如果没有重复,结果就是下标和数组内数字一一对。只要出现不对应也就是说一个下标对应多个数字就是重复了。那我就可以将数组内数字归位,如果归位过程中出现该位置已经有数字,说明该数字重复直接输出。如果直到归位结束都不重复,那么就代表没有重复,返回-1。

[2, 3, 1, 0, 2, 5, 3] # 从第一个元素开始判断

[1, 3, 2, 0, 2, 5, 3] # 第一次归位将2放到下标为2的位置,且下标为2的数字不是2

[3, 1, 2, 0, 2, 5, 3] # 第二次归位将1放到下标为1的位置,且下标为1的数字不是1

[0, 1, 2, 3, 2, 5, 3] # 第三次归位将3放到下标为3的位置, 且下标为3的数字不是3

[0, 1, 2, 3, 2, 5, 3] # 第一个元素和下标对应,依次判断第二个元素

[0, 1, 2, 3, 2, 5, 3] # 依次判断前四个元素与下标一一对应。开始判断第五个元素。

[0, 1, 2, 3, 2, 5, 3] # 第五个元素为2,但是判断发现下标为2的数字也是2,说明2重复出现,直接输出

代码实现
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param numbers int整型一维数组 
# @return int整型
#
class Solution:
    def duplicate(self , numbers ):
        # write code here
        # 依次判断每个元素
        for i in range(len(numbers)):
            # 重复判断同一个元素,直至该元素下标和值一致,结束循环
            while numbers[i] != i:
                # 获取该元素的值
                value_index = numbers[i]
                # 获取以该元素值为下标的数字
                item = numbers[value_index]
                # 如果该元素的值和以该元素为下标的数字一样,说明重复出现直接返回
                if value_index == item:
                    return item
                # 否则,进行归位
                numbers[i], numbers[value_index] = item, value_index
        # 如果全部归位,说明没有重复值,返回-1
        else:
            return -1

猜你喜欢

转载自blog.csdn.net/qq_42546127/article/details/115220843