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 相关文章推荐
Django框架使用mysql视图操作示例
May 15 Python
python识别图像并提取文字的实现方法
Jun 28 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
Oct 11 Python
使用matlab或python将txt文件转为excel表格
Nov 01 Python
Python 静态方法和类方法实例分析
Nov 21 Python
python中matplotlib实现随鼠标滑动自动标注代码
Apr 23 Python
python实现五子棋程序
Apr 24 Python
利用Python实现某OA系统的自动定位功能
May 27 Python
Python爬虫代理池搭建的方法步骤
Sep 28 Python
jupyter notebook 写代码自动补全的实现
Nov 02 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
Apr 24 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缩略图生成程式(需要GD库支持)
2007/03/06 PHP
php后台程序与Javascript的两种交互方式
2009/10/25 PHP
php读取纯真ip数据库使用示例
2014/01/26 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
激活 ActiveX 控件
2006/10/09 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
利用jQuery的$.event.fix函数统一浏览器event事件处理
2009/12/21 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
2015/07/27 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
python函数装饰器用法实例详解
2015/06/04 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
Python拼接字符串的7种方法总结
2018/11/01 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
Django stark组件使用及原理详解
2019/08/22 Python
Python3.7安装keras和TensorFlow的教程图解
2020/06/18 Python
简单了解Python读取大文件代码实例
2019/12/18 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
详解Pycharm出现out of memory的终极解决方法
2020/03/03 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
2020/08/27 Python
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
毕业生怎样写好自荐信
2013/11/11 职场文书
财务会计大学生自我评价
2014/04/09 职场文书
优秀学生评语大全
2014/04/25 职场文书
家长会标语
2014/06/24 职场文书
退学证明范本3篇
2014/10/29 职场文书
通报表扬范文
2015/01/17 职场文书