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 相关文章推荐
Python3中多线程编程的队列运作示例
Apr 16 Python
浅谈python jieba分词模块的基本用法
Nov 09 Python
Python操作MongoDB数据库的方法示例
Jan 04 Python
Python及Django框架生成二维码的方法分析
Jan 31 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
pyspark 读取csv文件创建DataFrame的两种方法
Jun 07 Python
python操作日志的封装方法(两种方法)
May 23 Python
Python+numpy实现矩阵的行列扩展方式
Nov 29 Python
pytorch 实现tensor与numpy数组转换
Dec 27 Python
关于keras中keras.layers.merge的用法说明
May 23 Python
无惧面试,带你搞懂python 装饰器
Aug 17 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 05 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
利用php绘制饼状图的实现代码
2013/06/07 PHP
php 判断是否是中文/英文/数字示例代码
2013/09/30 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
Node解决简单重复问题系列之Excel内容的获取
2018/01/02 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
手挽手带你学React之React-router4.x的使用
2019/02/14 Javascript
使用原生JS实现火锅点餐小程序(面向对象思想)
2019/12/10 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
JavaScript类的继承多种实现方法
2020/05/30 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
[04:03]DOTA2英雄梦之声_第02期_风暴之灵
2014/06/30 DOTA
python OpenCV学习笔记实现二维直方图
2018/02/08 Python
Redis使用watch完成秒杀抢购功能的代码
2018/05/07 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
HTML5 贪吃蛇游戏实现思路及源代码
2013/09/03 HTML / CSS
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
初级Java程序员面试题
2016/03/03 面试题
写自荐信要注意什么
2013/12/26 职场文书
大学校运会广播稿
2014/02/03 职场文书
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android
JavaScript 反射学习技巧
2021/10/16 Javascript