剑指Offer(Python多种思路实现):数组中重复的数字

剑指Offer(Python多种思路实现):数组中重复的数字

不修改数组找出重复的数字面试3题:

题:数组中重复的数字

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

思路一:先把输入数组排序,然后从排序后的数组中从前往后找。

解题代码:

def duplicate(self, numbers, duplication):
    if numbers==None or len(numbers)<=1:
        return False
    for i in range(len(numbers)):
        if numbers[i]<0 or numbers[i]>len(numbers)-1:
            return False
    
    numbers.sort()

    for i in range(len(numbers)-1):
        if numbers[i] == numbers[i+1]:
            duplication[0]=numbers[i]   # 任意重复的一个值并赋值到duplication[0]
            return True
    
    return False

解题思路二:重排数组

def duplicate(self, numbers, duplication):
    if numbers==None or len(numbers)<=1:  # 数组为空或者数组没有重复数字
        return False
    for i in range(len(numbers)):
        if numbers[i]<0 or number[i]>len(numbers)-1: # 数组超出了范围
            return False

    for i in range(len(numbers)):
        while (numbers[i]!=i):
            if numbers[i]==numbers[numbers[i]]:
                duplication[0]=numbers[i]
                return True
            else:
                temp=numbers[i]
                numbers[i]=numbers[temp]
                numbers[temp]=temp
    return False

解题思路三:不修改数组找出重复的数字。

# 三、不修改数组
# def find_duplicate(nums: list) -> int:
def countRange(self, numbers, start, end):
    if not numbers: return 0
    return sum(start<=number<=j for number in numbers)

def duplicate(self, numbers):
    if not numbers or len(numbers)<=0:
        return False
    start=1
    end=len(numbers)-1
    while start<=end:
        middle=(end-start)//2+start  # 算中位数公式
        count=self.countRange(numbers, start, middle)
        if start==end:
            if count > 1:
                return start
            else:
                break
        if count > middle-start+1:
            end=middle
        else:
            start=middle+1
    return False
发布了18 篇原创文章 · 获赞 1 · 访问量 4269

猜你喜欢

转载自blog.csdn.net/weixin_44151089/article/details/104386501