先讲思路,再避坑,最后贴代码(借鉴了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]]的值,其实并没有赋值,看到了吗?