①第一个想到的就是再创建一个新数组,将数组遍历过的数据存入新数组中,检查存入的数据是否在新数组中出现过。
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
if not nums:
return
new = []
for i in range(len(nums)):
if nums[i] in new:
return nums[i]
new.append(nums[i])
#执行用时: 5832 ms
# 内存消耗: 23.5 MB
②还想到一个就是用字典的方法:其实和数组那个差不多的思想。也是先存然后找
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
if not nums:
return
dic = {}
for num in nums:
if num not in dic:
dic[num] = 1
else:
return num
# 执行用时:36 ms, 在所有 Python3 提交中击败了94.81%的用户
# 内存消耗:23.6 MB, 在所有 Python3 提交中击败了22.40%的用户
-------------看了题解之后
③可以使用原地交换的方法。题目有提到数组中的数字为0-n-1,那么将数组的索引和内容相对应上就好了
开始没看代码,自己敲了一遍:
for i in range(len(nums)):
if i != nums[i]:
if nums[nums[i]] == nums[i]:
return nums[i]
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
return -1
发现有一个致命的错误,就是只能将索引中的数字放在了正确的位置,但是放回来的数字我就没有管了。。所以出错了。。
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
i = 0
while i < len(nums):
if nums[i] == i:
i += 1
continue
if nums[nums[i]] == nums[i]: return nums[i]
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
return -1