0722 钉钉日报

数组中重复的数字

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。

数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。

请找出数组中任意一个重复的数字。

示例 1:

输入:

[2, 3, 1, 0, 2, 5, 3]

输出:2 或 3

------------------------------------------------------------------

方法一

import random
def countrepeat(nums):

    return random.choice(list(i for i in nums if nums.count(i) > 1))
print(countrepeat(nums=[2, 3, 1, 0, 2, 5, 3]))

------------------------------------------------------------------

方法二

from collections import Counter
def find_repeat1(nums): #传入的是字典
    return [k for k, v in Counter(nums).items() if v > 1]

print(find_repeat1([2, 3, 1, 0, 2, 5, 3, 3]))
'''[2, 3]'''

------------------------------------------------------------------

方法三

def find_repeat2(nums):
    return list(set([n for n in nums if nums.count(n) > 1]))

print(find_repeat2([2, 3, 1, 0, 2, 5, 3, 3]))
'''[2, 3]'''

------------------------------------------------------------------

方法四

def find_repeat3(nums):
    return list(set([nums[n] for n in range(len(nums)) if nums[n] in nums[n+1:]]))

print(find_repeat3([2, 3, 1, 0, 2, 5, 3, 3]))
'''[2, 3]'''

------------------------------------------------------------------

方法五

def find_repeat4(nums):
    nums = sorted(nums)   #这里可以和 nums.sort() 这种方法进行比较
    print(nums)            #输出[0, 1, 2, 2, 3, 3, 5],与nums.sort() 这种方法结果一样
    return list(set([nums[n] for n in range(len(nums)-1) if nums[n] == nums[n+1]]))
    # 这里不可以像下面这行操作,否则会出现 IndexError: list index out of range
    # return list(set([nums[n] for n in range(len(nums)) if nums[n] == nums[n + 1]]))
    # 这里一下子嵌套了好几层,需要熟练后再操作
    #   从内往外看,其实就是先找出nums内出现重复值的所有序位上的值,
    # 然后放在set集合内进行去重,再用list做一个列表

print(find_repeat4([2, 3, 1, 0, 2, 5, 3]))
'''[2, 3]'''

------------------------------------------------------------------

方法六

def repeatnum(nums):
    nums.sort()       #先进行升序的排序
    print(nums)       #输出[0, 1, 2, 2, 3, 3, 5]
    n=len(nums)
    for i in range(0,n):
        if nums[i]==nums[i+1]:  #由于已经有了前后的顺序排序,所以直接看
            # 后面序位的跟前一位的是不是一样的
            return nums[i]

print(repeatnum([2, 3, 1, 0, 2, 5, 3]))

------------------------------------------------------------------

方法七

def func1(nums):
    import random
    while len(nums):
        n=random.choice(nums)
        if nums.count(n)>1:
            return n

print(func1([2, 3, 1, 0, 2, 5, 3]))

------------------------------------------------------------------

方法八

def func2(nums):
    print(set(nums))  #set 是用来去重的,相当于将集合内出现了第一次时候记录下来
    #输出{0, 1, 2, 3, 5}
    import random
    for x in set(nums):
        nums.remove(x)    #将简练后的set集合内的数和nums列表内进行对比,
        # 并将数摘除掉,此时nums剩下的就是第二次及以上还出现的数
    print(nums)                #输出[2, 3]
    return random.choice(nums)

print(func2([2, 3, 1, 0, 2, 5, 3]))

'''3'''

------------------------------------------------------------------

方法九

from collections import Counter
def func1(nums):
    c=Counter(nums)
    print(c)       #输出了字典Counter({2: 2, 3: 2, 1: 1, 0: 1, 5: 1})
    print(c.most_common())    #将 key和值成元组形式存在于列表内
    #[(2, 2), (3, 2), (1, 1), (0, 1), (5, 1)]
    return c.most_common()[0][0]  #是从高到低排序的,
    # 而且只能在Counter 的字典内使用
print(func1([2, 3, 1, 0, 2, 5, 3]))

''' 2'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值