[python]找出数组中出现的次数超过数组长度的一半(or 1/3)的数字

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 15 15:47:54 2018

@author: dengyuzhao
"""

class Solution:
    def MoreThanHalfNum_Solution(self, array):
        # write code here
        if not array:
            return 0
        result=array[0]
        t=1
        for i in range(1,len(array)):
            if 2*t>len(array):
                break
            if t==0:
                result=array[i]
                t=1
            if array[i]==result:
                t+=1
            else:
                t-=1
        t=0
        for i in range(len(array)):
            if array[i]==result:
                t+=1
        if 2*t<=len(array):
            result=0
        return result
    
    def MoreThanOneThirdNum_Solution(self, array):
        if not array:
            return [0]
        a=array[0]
        b=array[1]
        m=1
        n=1
        result=[]
        for i in range(2,len(array)):
            #如果两个都存在
            if m>0 and n>0:
                if array[i]!=a and array[i]!=b:
                    m-=1
                    n-=1
                if array[i]==a:
                    m+=1
                if array[i]==b:
                    n+=1
            elif m>0 and n==0:
                if array[i]!=a:
                    b=array[i]
                    n=1
                if array[i]==a:
                    m+=1
            elif m==0 and n>0:
                if array[i]!=b:
                    a=array[i]
                    m=1
                if array[i]==b:
                    n+=1
            else:
                a=array[i]
                m=1
        if m>0:
            m=0
            for i in range(len(array)):
                if array[i]==a:
                    m+=1
            if m*3>len(array):
                result.append(a)
        if n>0:
            n=0
            for i in range(len(array)):
                if array[i]==b:
                    n+=1
            if n*3>len(array):
                result.append(b)
        if result==[]:
            return [0]
        return result

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值