掌握正确的学习方法 | 【对不起,我要开始装逼了】
通过学习别人的代码,获取新的知识,进而提高自己的技术水平。
起因
昨天晚上在pythontip刷题的时候,刷到如下题目。
给你一个整数列表L, 输出L的中位数(若结果为小数,则保留一位小数)。
例如: L=[0,1,2,3,4]
则输出:2
对于大多数人来说没啥难度,但是这里我要说的并不只是如何解答这道题,更多的是传达一种思想。
解题思路
首先明确中位数的概念,以及如何通过程序的方式获取中位数,
概念:
中位数(Medians)统计学名词,是指将统计总体当中的各个变量值按大小顺序排列起来,形成一个数列,处于变量数列中间位置的变量值就称为中位数,用Me表示。当变量值的项数N为奇数时,处于中间位置的变量值即为中位数;当N为偶数时,中位数则为处于中间位置的2个变量值的平均数。
分析重点:
首先有序,从小大到的顺序,也就是说第一步要排序,python中我们可以使用sorted即可。
确定元素的个数是奇数还是偶数:
奇数,取中间元素即为中位数,例如[1,2,3,4,5]5个元素,个数为奇数 也就是取中间数字,即3
偶数,取中间2个元素并取平均即为中位数,例如[1,2,3,4,5,6] 6个元素,个数为偶数 也就是取中间2个数字并取其平均数,即(3+4)/3=3.5
我的代码
L=[1,2,3,4,5,6]L.sort()if len(L)%2==0: print (L[len(L)/2-1]+L[len(L)/2])/2.00else: print L[(len(L)-1)/2]
觉得很简单就是应用数学原理搞定,直到我看到下面解法:
# 中位数
# L = [0, 1, 2, 3, 4] # 2
L = [0, 1, 3, 4, 5,7]
L.sort()
l_len = len(L)
n = (l_len - 1) // 2 #向下取整
if l_len & 0x1:
print(L[n])
else:
print('%.1f' %((L[n] + L[n+1]) / 2.0))
第一次看这代码一脸懵逼,首先//这个符号,还真就没怎么用过,后来查资料发现意思是向下取整,这个大部分人应该知道,然后看到奇怪的&0x1这是啥玩意呢,经过询问度娘,我找到了如下解释:
C语言中&表示按位与,0x开头的表示的是十六进制数,k&0x1表示k与0x1按位与,
其效果为取k的二进制中最右边的数字,该式也可以用做判断k的奇偶性, 如果k为奇数,其计算结果为1,否则为0。
这个解释已经说的很详细,这个操作就是为了计算奇偶性的,大家可以利用起来哦,是不是很酷。
学习方法很多种,关键看你如何选择,和优秀的人学习,才能不断进步不是嘛。
另外,今天给大家精心推荐一些行业里做的比较用心的技术公众号,覆盖不同的技术领域,相信对大家的技术成长之路有一定的帮助。
IT行业技术圈