剑指offer 面试题03. 数组中重复的数字

题目链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/

目录

题目:

方法1:双重循环暴力判断

方法2:list角标索引法

方法3:Counter的使用

方法4:dict字典方法

方法5:set方法

方法6:排序法

方法7:原地交换(较为巧妙,参考了网上资料)


题目:

题目本身很简单,在这里给出多种尝试的方法

方法1:双重循环暴力判断

虽然这个方法过于简单,也没有作为首先尝试的方法,由于输入的n最大可以达到10的5次方,在时间复杂度O(N^2)的情况下也是没有意外的超时了。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值