剑指offer 03.数组中重复的数字(python)

先讲思路,再避坑,最后贴代码(借鉴了leetcode高赞回答,但是有结合自己的思考)

题目:

 

一:暴力破解

思路:

依次把元素放到集合set里面去,由于集合是无序无重复元素的,所以每次判断一下当前元素是否已经在集合里面,如果在直接return,如果不在就进入下一个循环。

代码:

        dic = set()
        for num in nums:
            if num in dic:return num
            dic.add(num)
        return -1

二:原地交换

思路:

遇到第一个元素2,我就让他放在索引位置为2的地方。也就是和当前索引位置为2的元素,交换位置。每一步循环,都将进行这个操作。但是如果,该元素值已经在对应的地方,那我就跳过;如果当前元素值,nums[i]又等于2,而我们之前已经把2放到了指定的索引位置,那就证明2已经重复出现了,不是吗?即nums[i]==nums[nums[i]]时,我们就直接return

代码:

        i = 0
        while i < len(nums):
            if nums[i]==i:
                i += 1
                continue
            if nums[i]==nums[nums[i]]:return nums[i]
            nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
        return -1

这里需要注意的是,如果交换顺序

nums[i], nums[nums[i]] = nums[nums[i+1]], nums[i]是不可行的,为什么?

先令nums[i] = a, nums[nums[i]]=b,也就是nums[a] = b

首先,a=nums[a]=b

随后,nums[b] = b

结果:nums[i]最后的值为nums[nums[i]]

nums[nums[i]]的值,其实并没有赋值,看到了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值