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深入学习之上下文管理器
Aug 31 Python
10款最好的Web开发的 Python 框架
Mar 18 Python
Python中encode()方法的使用简介
May 18 Python
安装python3的时候就是输入python3死活没有反应的解决方法
Jan 24 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
python pandas写入excel文件的方法示例
Jun 25 Python
python集合常见运算案例解析
Oct 17 Python
python实现简单日志记录库glog的使用
Dec 13 Python
Django框架之中间件MiddleWare的实现
Dec 30 Python
python 三种方法实现对Excel表格的读写
Nov 19 Python
Python编写万花尺图案实例
Jan 03 Python
python爬虫之利用selenium模块自动登录CSDN
Apr 22 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
德劲1104的电路分析与改良
2021/03/01 无线电
用PHP发电子邮件
2006/10/09 PHP
PHP 分页类(模仿google)-面试题目解答
2009/09/13 PHP
分享PHP守护进程类
2015/12/30 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
js获取鼠标位置实例详解
2015/12/09 Javascript
最简单的tab切换实例代码
2016/05/13 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
[52:06]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
浅析Python的Django框架中的Memcached
2015/07/23 Python
Python画柱状统计图操作示例【基于matplotlib库】
2018/07/04 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
Python如何给函数库增加日志功能
2020/08/04 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
小学毕业家长寄语
2014/01/19 职场文书
做一个有道德的人活动实施方案
2014/08/23 职场文书
出生医学证明书
2014/09/15 职场文书
2014银行领导班子群众路线对照检查材料思想汇报
2014/09/17 职场文书
党的作风建设心得体会
2014/10/22 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
2019年最新借条范本!
2019/07/08 职场文书
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫
MongoDB支持的索引类型
2022/04/11 MongoDB