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生成随机数的方法
Jan 14 Python
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 Python
pygame学习笔记(1):矩形、圆型画图实例
Apr 15 Python
Python中处理字符串之isalpha()方法的使用
May 18 Python
深入浅析Python字符编码
Nov 12 Python
Python 迭代器工具包【推荐】
May 06 Python
Python数据类型详解(三)元祖:tuple
May 08 Python
Python设计模式之代理模式简单示例
Jan 09 Python
Python入门之后再看点什么好?
Mar 05 Python
pyqt5与matplotlib的完美结合实例
Jun 21 Python
django admin 添加自定义链接方式
Mar 11 Python
pyinstaller打包找不到文件的问题解决
Apr 15 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 多维数组排序(usort,uasort)
2010/06/30 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
js不是基础的基础
2006/12/24 Javascript
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
JS 文件传参及处理技巧分析
2010/05/13 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
jQuery实现带渐显效果的人物多级关系图代码
2015/10/16 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
JavaScript实现多重继承的方法分析
2018/01/09 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
Python中实现常量(Const)功能
2015/01/28 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
python的mysql数据库建立表与插入数据操作示例
2019/09/30 Python
Python logging模块原理解析及应用
2020/08/13 Python
用python进行视频剪辑
2020/11/02 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
英国在线花园中心:You Garden
2018/06/03 全球购物
工程力学硕士生的自我评价范文
2013/11/16 职场文书
社区党总支书记先进事迹材料
2014/01/24 职场文书
创业计划书如何编写
2014/02/06 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
python获取淘宝服务器时间的代码示例
2021/04/22 Python