题目链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
目录
题目:
题目本身很简单,在这里给出多种尝试的方法
方法1:双重循环暴力判断
虽然这个方法过于简单,也没有作为首先尝试的方法,由于输入的n最大可以达到10的5次方,在时间复杂度的情况下也是没有意外的超时了。
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if nums[i] == nums[j]:
return nums[i]
方法2:list角标索引法
注意到题目给出的限制后,这个数量级的数据一般不会造成runtime error的问题,直接建立一个10的5次方的列表,进行角标索引。
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
indexList = [0 for x in range(100005)] # 注意到给出的限制2 <= n <= 100000
for i, num in enumerate(nums):
if indexList[num] != 0:
return num
else:
indexList[num] += 1
方法3:Counter的使用
练习Counter类的使用
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dictNums = Counter(nums)
#print(dictNums)
for key, val in dictNums.items():
print(key, val)
if val != 1:
print(key)
return key
方法4:dict字典方法
本质和Counter方法区别不大
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dictNums = dict()
for i, num in enumerate(nums):
try:
return dictNums[num]
except:
dictNums[num] = num
方法5:set方法
这个方法由于涉及到set的使用方法值得积累。判断一个元素是否在set中使用in进行判断;向set中加入新的元素使用.add()方法
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#需要积累set方法的运用方法
setNums = set()
#print(setNums)
for i, num in enumerate(nums):
if not num in setNums:
setNums.add(num)
else:
return num
方法6:排序法
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums.sort()
#print(nums)
for i in range(len(nums)):
if nums[i] == nums[i+1]:
return nums[i]
方法7:原地交换(较为巧妙,参考了网上资料)
相关原理说明解释写在以下代码中
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#目的是把index角标和value值换到一起,是一个比较巧妙的思路,进行学习
#i是index,nums[i]是value
for i in range(len(nums)):
if i == nums[i]: # 如果走到这个地方,index = value,则继续,这可以算第一次找到,也可以算是正常的找到
i += 1
continue
else: # 遇到了index != value,需要进行排序处理
if nums[nums[i]] == nums[i]: # 如果使用当前value进行索引到的值,与当前value相等
return nums[i]
else:
#把当前的value换到value对应的index处!这样一定换出了一组对应的index-value
tempNum = nums[nums[i]]
nums[nums[i]] = nums[i]
nums[i] = tempNum