python 计算数组中每个数字出现多少次--“Bucket”桶的思想


Posted in Python onDecember 19, 2017

题目:

python 计算数组中每个数字出现多少次--“Bucket”桶的思想

解法一:比较元素是否相等

思路说明:

这种应该是普通人最先想到的解法,先获取到数组之后进行有小到大排序,然后初始化一个min=0(代表新数字的开始角标),然后遍历新数组的每一个元素,如果两个元素不相等,count等于i-min,然后再把i赋值给min,当i遍历到最后一个元素时,count等于数组长度-min(这里的min是上一轮循环后最后一组数字的第一个元素的角标),当然这种解法面试官不会喜欢?

(m, n) = input().split()
ar = [int(x) for x in input().split()]
res = []
ar.sort()
min = 0
for i in range(1,len(ar)) :
  if ar[i-1] != ar[i]:
    count = i - min
    min = i
    res.append(str(count))
  if i == (len(ar)-1):
    count = len(ar)-min
    res.append(str(count))
print(' '.join(res))

解法二:桶计算

思路:获取到输入的数组之后,获取该数组的长度,因为根据题目N<=20,也就是说数组的元素不会超过20,那么我们定义一个1维,长度为20的数组res,并初始化元素为0是足够的。先上代码,再进行解析

(m, n) = input().split()
ar = [int(x) for x in input().split()]
result = []
res = [0 for x in range(20)]
for a in ar:
  res[a-1]+=1
for r in res:
  if r != 0:
    result.append(str(r))
print(' '.join(result))

以上的而核心代码就在于这两行

for a in ar:
  res[a-1]+=1

我们遍历输入的数组ar的每一个元素,用res[a]的数值代表a出现的次数,我们每次循环,总能找到合适的桶存放a,那么我们直接+1即可,比如说ar = [2, 2, 1, 4]

循环1: 
a = 2 
res[2] = 0+1 = 1 
循环2: 
a = 2 
res[2] = 1 +1 =2 
循环3: 
a = 1 
res[1] = 0+1 = 1 
循环4: 
a = 4 
res[4] = 0+1 = 1 
这样我们得到的 res = [0, 1 ,2 ,0 ,1 ,0 ····]

延伸:桶排序

根据以上的思路我们得到了一个新的数组res,仔细分析这个数组的意思,1出现1次,2出现2次,4出现1次,因为数组的特性保证元素的角标是从小到大排序,这就衍生出了桶排序的概念,忽略0的情况,用两个循环,外层循环遍历len(res)次,角标为i,内层循环遍历res[i]次,角标为j,意思就是有几个输出几个,例如1有1个,那就输出1个,2有两个,就循环两次,输出两次,4有1个,就输出一个,扩展代码如下:

#省略上述代码
for i in range(len(res)):
  if res[i] != 0:
    for j in range(res[i]):
      result.append(i)
print(result)

执行结果如下:

python 计算数组中每个数字出现多少次--“Bucket”桶的思想

Python 相关文章推荐
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 Python
利用Python的Django框架中的ORM建立查询API
Apr 20 Python
wxPython中listbox用法实例详解
Jun 01 Python
Python 含参构造函数实例详解
May 25 Python
PyChar学习教程之自定义文件与代码模板详解
Jul 17 Python
详解 Python 与文件对象共事的实例
Sep 11 Python
python3.6连接MySQL和表的创建与删除实例代码
Dec 28 Python
python实现换位加密算法的示例
Oct 14 Python
Django开发的简易留言板案例详解
Dec 04 Python
详解Python用户登录接口的方法
Apr 17 Python
春节到了 教你使用python来抢票回家
Jan 06 Python
Win 10下Anaconda虚拟环境的教程
May 18 Python
浅谈Python实现贪心算法与活动安排问题
Dec 19 #Python
Python实现感知器模型、两层神经网络
Dec 19 #Python
python实现感知器
Dec 19 #Python
python绘制简单折线图代码示例
Dec 19 #Python
matplotlib设置legend图例代码示例
Dec 19 #Python
matplotlib中legend位置调整解析
Dec 19 #Python
python实现感知器算法详解
Dec 19 #Python
You might like
linux实现php定时执行cron任务详解
2013/12/24 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
2016/07/27 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
基于AngularJS的拖拽文件上传的实例代码
2017/07/15 Javascript
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
如何在微信小程序中实现Mixins方案
2019/06/20 Javascript
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
Python实现复杂对象转JSON的方法示例
2017/06/22 Python
Python实现按中文排序的方法示例
2018/04/25 Python
简单了解python中对象的取反运算符
2019/07/01 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
Python3基于plotly模块保存图片表格
2020/08/03 Python
CK美国官网:Calvin Klein
2016/08/26 全球购物
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
商务英语专业自荐信
2013/10/14 职场文书
应届毕业生求职信
2014/05/26 职场文书
个性与发展自我评价
2015/03/06 职场文书
张丽莉观后感
2015/06/16 职场文书
公司员工管理制度
2015/08/04 职场文书
初中班主任心得体会
2016/01/07 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
golang elasticsearch Client的使用详解
2021/05/05 Golang
OpenCV-Python实现轮廓拟合
2021/06/08 Python
详解Vue的列表渲染
2021/11/20 Vue.js