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刷投票的脚本实现代码
Nov 08 Python
Python实现计算文件夹下.h和.cpp文件的总行数
Apr 23 Python
详解python开发环境搭建
Dec 16 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
Oct 16 Python
pandas 数据归一化以及行删除例程的方法
Nov 10 Python
Python写一个基于MD5的文件监听程序
Mar 11 Python
三步实现Django Paginator分页的方法
Jun 11 Python
python os.fork() 循环输出方法
Aug 08 Python
使用Windows批处理和WMI设置Python的环境变量方法
Aug 14 Python
python3中numpy函数tile的用法详解
Dec 04 Python
2021年pycharm的最新安装教程及基本使用图文详解
Apr 03 Python
Python实现简单的俄罗斯方块游戏
Sep 25 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
php引用返回与取消引用的详解
2013/06/08 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
Windows7下的php环境配置教程
2015/02/28 PHP
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
javascript折半查找详解
2015/01/26 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
2015/03/18 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
20个常用Python运维库和模块
2018/02/12 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
2020/02/26 Python
python如何实时获取tcpdump输出
2020/09/16 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
幼儿教师个人求职信范文
2013/09/21 职场文书
护士思想汇报
2014/01/12 职场文书
社会保险接收函
2014/01/12 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
毕业留言寄语大全
2014/04/10 职场文书
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL