鱼C论坛

 找回密码
 立即注册
查看: 4286|回复: 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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-20 14:02:28 | 显示全部楼层
什么鬼?什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

假设结果是 res,那么 res 在数组中出现的次数应该 > len(数组) / 2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-10-20 14:57:07 | 显示全部楼层
时间复杂度低
def f(l):
    d={}
    for e in l:
        d[e]=d.get(e,0)+1
        if d[e]>=len(l)/2:
            return e
强行一行
def f(l):
    return sorted(__import__('collections').Counter(l).items(),key=lambda x:x[1])[-1][0]

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


def kao(lst):
    
    lstlen = len(lst)
    if lstlen > 2:
        halfLen = int(lstlen / 2 + 0.5)
        if halfLen == lstlen / 2:
            halfLen += 1
        try:
            num, _ = Counter(lst).most_common(2)
            return num[0] if num[1] >= halfLen else False
        except ValueError:
            return False
    else:
        return False


lst = [1, 1, 1, 1, 1]
print(kao(lst))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


print(find_main([1, 1, 1, 2, 2]))

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 18:57:06 | 显示全部楼层
from collections import Counter
def fun(a):
    c = Counter()
    for i in a:
        c[i] = c[i]+1
    for s in c: 
        if c[s] > len(a)/2:
            return s
      

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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('该数组没有主元素!!!')
想知道小甲鱼最近在做啥?请访问 -> 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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 21:25:11 | 显示全部楼层
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('该数组没有主元素!!!')

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

如果整数数组的元素中没有这样的元素,需要返回吗(是什么?)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 22:46:52 | 显示全部楼层
是指出现次数最多那个,还是所有大于二分之一的元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

出现最多,还要大于一半
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

出现次数大于一半,必然次数最多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

if __name__ == '__main__':
    print('示例1 输出:',solve([1,1,1,1,2,2,2]))
    print('示例2 输出:',solve([1,1,1,2,2,2,2]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

        for item in nums:
            if major_num == item:
                count += 1
            elif count == 0:
                major_num = item
                count += 1
            else:
                count -= 1

        return major_num

if __name__ == '__main__':    
    mf = MajorFinder()
    source = [1, 2, 1, 5, 1, 2, 2, 2, 2]
    major = mf.major_number(source)
    print('major: {0}'.format(major))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-17 04:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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