鱼C论坛

 找回密码
 立即注册
查看: 6704|回复: 38

[已解决]Python:每日一题 260

[复制链接]
发表于 2019-10-20 13:45:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一

示例 1:

输入:[1, 1, 1, 1, 2, 2, 2]
输出:1
示例 2:

输入:[1, 1, 1, 2, 2, 2, 2]
输出:2


欢迎大家一起答题!
最佳答案
2019-10-20 21:15:01
def solution(nums: list) -> int:
    myDict = {}
    mylen = len(nums)//2
    for i in nums:
        v = myDict.get(i, 0)
        if v+1>mylen:
            return i
        myDict[i] = v+1

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-20 14:02:28 | 显示全部楼层
什么鬼?什么意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-20 14:03:37 | 显示全部楼层
_2_ 发表于 2019-10-20 14:02
什么鬼?什么意思?

假设结果是 res,那么 res 在数组中出现的次数应该 > len(数组) / 2
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 14:25:01 | 显示全部楼层
  1. def func(list1):
  2.     for each in set(list1):
  3.         if list1.count(each) > len(list1)/2:
  4.             return each
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-10-20 14:57:07 | 显示全部楼层
时间复杂度低
  1. def f(l):
  2.     d={}
  3.     for e in l:
  4.         d[e]=d.get(e,0)+1
  5.         if d[e]>=len(l)/2:
  6.             return e
复制代码

强行一行
  1. def f(l):
  2.     return sorted(__import__('collections').Counter(l).items(),key=lambda x:x[1])[-1][0]
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 15:29:00 | 显示全部楼层
没啥基础的人瞎写的:
  1. zu1 = (1,1,1,1,3,3,3,3)
  2. i=0
  3. for each in zu1:
  4.     if zu1.count(each) > len(zu1)/2:
  5.         break
  6. if zu1.count(each) > len(zu1)/2:   
  7.     print(each)
  8. else:
  9.     print('没有')
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 15:33:10 | 显示全部楼层
本帖最后由 kaohsing 于 2019-10-20 19:48 编辑
  1. from collections import Counter


  2. def kao(lst):
  3.    
  4.     lstlen = len(lst)
  5.     if lstlen > 2:
  6.         halfLen = int(lstlen / 2 + 0.5)
  7.         if halfLen == lstlen / 2:
  8.             halfLen += 1
  9.         try:
  10.             num, _ = Counter(lst).most_common(2)
  11.             return num[0] if num[1] >= halfLen else False
  12.         except ValueError:
  13.             return False
  14.     else:
  15.         return False


  16. lst = [1, 1, 1, 1, 1]
  17. print(kao(lst))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 16:45:23 | 显示全部楼层
  1. ss = lambda ss : [i for i in set(ss) if ss.count(i) > len(ss)/2]
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 17:00:57 | 显示全部楼层
本帖最后由 __mrsq__ 于 2019-10-20 17:09 编辑
  1. def find_main(num_list):
  2.     visited = []
  3.     for num in num_list[0:int(len(num_list) / 2 + 0.5)]:
  4.         if num not in visited:
  5.             if num_list.count(num) > len(num_list) / 2:
  6.                 return num
  7.         visited.append(num)
  8.     return None


  9. print(find_main([1, 1, 1, 2, 2]))
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 18:57:06 | 显示全部楼层
  1. from collections import Counter
  2. def fun(a):
  3.     c = Counter()
  4.     for i in a:
  5.         c[i] = c[i]+1
  6.     for s in c:
  7.         if c[s] > len(a)/2:
  8.             return s
  9.       
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 20:54:41 | 显示全部楼层
num_c = input('请输入你想测试的数组,如[1,1,1,1,2,2,2]:')
a = num_c[1:-1].split(',')
a_num = list(map(lambda x:int(x),a))
b = list(set(a_num))
c_dict = dict()
for i in b:
    c=sum(list(map(lambda x:x==i,a_num)))
    c_dict.setdefault(i,c)
for i in b:
    if c_dict.get(i,'木有')>len(a)//2:
        print('该数组的主元素为:',i)
        break
else:
    print('该数组没有主元素!!!')
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 21:15:01 | 显示全部楼层    本楼为最佳答案   
def solution(nums: list) -> int:
    myDict = {}
    mylen = len(nums)//2
    for i in nums:
        v = myDict.get(i, 0)
        if v+1>mylen:
            return i
        myDict[i] = v+1

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 21:25:11 | 显示全部楼层
  1. num_c = input('请输入你想测试的数组,如[1,1,1,1,2,2,2]:')
  2. a = num_c[1:-1].split(',')
  3. a_num = list(map(lambda x:int(x),a))
  4. b = list(set(a_num))
  5. c_dict = dict()
  6. for i in b:
  7.     c=sum(list(map(lambda x:x==i,a_num)))
  8.     c_dict.setdefault(i,c)
  9. for i in b:
  10.     if c_dict.get(i,'木有')>len(a)//2:
  11.         print('该数组的主元素为:',i)
  12.         break
  13. else:
  14.     print('该数组没有主元素!!!')
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 21:31:20 | 显示全部楼层
来啦来啦
错过了好几期呜呜呜
  1. def get_main(nums):
  2.     s = len(nums)
  3.     while True:
  4.         target = nums[0]
  5.         t = 0
  6.         for each in nums:
  7.             if target == each:
  8.                 t += 1
  9.         if t > s/2:
  10.             return nums[0]
  11.         else :
  12.             nums.remove(target)
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 22:39:02 | 显示全部楼层
zltzlt 发表于 2019-10-20 14:03
假设结果是 res,那么 res 在数组中出现的次数应该 > len(数组) / 2

如果整数数组的元素中没有这样的元素,需要返回吗(是什么?)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 22:46:52 | 显示全部楼层
是指出现次数最多那个,还是所有大于二分之一的元素
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 23:08:13 | 显示全部楼层
wiselin 发表于 2019-10-20 22:46
是指出现次数最多那个,还是所有大于二分之一的元素

出现最多,还要大于一半
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-21 07:29:26 | 显示全部楼层
wiselin 发表于 2019-10-20 22:46
是指出现次数最多那个,还是所有大于二分之一的元素

出现次数大于一半,必然次数最多
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-21 07:41:38 | 显示全部楼层
我这里采用 None 对象来返回出现数组中只有两种元素,但是这两种元素出现的频率完全一样的情况。比如:[1,1,1,2,2,2]
  1. def solve(room):
  2.     total = [x for x in set(room) if room.count(x)>len(room)/2]
  3.     return total[0] if len(total) else None

  4. if __name__ == '__main__':
  5.     print('示例1 输出:',solve([1,1,1,1,2,2,2]))
  6.     print('示例2 输出:',solve([1,1,1,2,2,2,2]))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-21 09:25:29 | 显示全部楼层
本帖最后由 XiaoPaiShen 于 2019-10-21 09:27 编辑
  1. class MajorFinder:
  2.     def major_number(self, nums):
  3.         major_num, count = 0, 0

  4.         for item in nums:
  5.             if major_num == item:
  6.                 count += 1
  7.             elif count == 0:
  8.                 major_num = item
  9.                 count += 1
  10.             else:
  11.                 count -= 1

  12.         return major_num

  13. if __name__ == '__main__':   
  14.     mf = MajorFinder()
  15.     source = [1, 2, 1, 5, 1, 2, 2, 2, 2]
  16.     major = mf.major_number(source)
  17.     print('major: {0}'.format(major))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-4 14:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表