知识点:进制转化、排序、堆
问题描述:
如何得到一个数据流中的中位数?
如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
我们使用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()
两种方法的区别在于定义函数时属性赋值是否允许为空和实例化时是否直接传入参数。
参考链接:
- https://blog.youkuaiyun.com/weixin_41644993/article/details/96638853
- https://blog.youkuaiyun.com/qq_36936730/article/details/104790862