【剑指Offer】63. Python实现数据流中的中位数

知识点:进制转化、排序、堆

问题描述:

如何得到一个数据流中的中位数?

如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

思路:

首先初始化一个数组,数组用来储存数据流。

获取中位数,先对数组排序。

如果数组的长度为偶数,中位数就是所有数值排序之后中间两个数的平均值。如果数组的长度为奇数,中位数就是所有数值排序之后最中间的那个数。

详解:

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.nums=[]
    def Insert(self, num):
        # write code here
        self.nums.append(num)
    def GetMedian(self,n=None):
        # write code here
        self.nums.sort()
        if len(self.nums)%2==0:
            res=(self.nums[len(self.nums)/2]+self.nums[len(self.nums)/2-1])/2.0
        else:
            res=self.nums[len(self.nums)//2]
        return res

注意:

当数据流的长度为偶数时,res=(self.nums[len(self.nums)/2]+self.nums[len(self.nums)/2-1])/2.0,而不能写成res=(self.nums[len(self.nums)/2]+self.nums[len(self.nums)/2-1])/2,这样运行不通过。

知识点:

def init(self) ,参数只有一个self,指的是实例的本身,但是在方法的类部,可以包含属性。它允许定义一个空的结构,当新数据来时,可以直接添加。实例化时,需要实例化之后,再进行赋值。如下在方法的类部包含两个属性name, score。

class Game:  # 定义类Game
    def __init__(self):  # 创建类中的函数,也叫方法
        self.name = None
        self.score = None

    def print_score(self):
        print("%s score is %s" % (self.name,self.score))

s1 = Game()  # 创建对象s1
s1.name = "Tom"
s1.score = 8

s2 = Game()  # 创建对象s2
s2.name = "Jerry"
s2.score = 7

s1.print_score()
s2.print_score()

def init(self, 参数1,参数2,···,参数n) 形式,这种形式在定义方法时,就直接给定了参数,且属性值不允许为空。实例化时,直接传入参数。如下:在定义方法时,就直接给定了两个参数name和score。

class Game:  # 定义类Game
    def __init__(self, name, score):  # 创建类中的函数,也叫方法
        self.name = name
        self.score = score

    def print_score(self):
        print("%s score is %s" % (self.name,self.score))

s1 = Game("Tom", 8)  # 创建对象s1

s2 = Game("Jerry", 7)  # 创建对象s2

s1.print_score()
s2.print_score()

两种方法的区别在于定义函数时属性赋值是否允许为空和实例化时是否直接传入参数。

参考链接:

  1. https://blog.youkuaiyun.com/weixin_41644993/article/details/96638853
  2. https://blog.youkuaiyun.com/qq_36936730/article/details/104790862
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值