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 07 Python
python进阶教程之函数参数的多种传递方法
Aug 30 Python
详解python单例模式与metaclass
Jan 15 Python
python实现获取Ip归属地等信息
Aug 27 Python
详解Python中最难理解的点-装饰器
Apr 03 Python
python实现整数的二进制循环移位
Mar 08 Python
python-web根据元素属性进行定位的方法
Dec 13 Python
python 输出列表元素实例(以空格/逗号为分隔符)
Dec 25 Python
tensorflow tf.train.batch之数据批量读取方式
Jan 20 Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 Python
Python通过yagmail实现发送邮件代码解析
Oct 27 Python
使用Python通过企业微信应用给企业成员发消息
Apr 18 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读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
2018/05/23 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
PHP 文件上传限制问题
2019/09/01 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
AngularJS实时获取并显示密码的方法
2018/02/06 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
2019/03/04 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
Node.js中的异步生成器与异步迭代详解
2021/01/31 Javascript
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
解决Python对齐文本字符串问题
2019/08/28 Python
Python 导入文件过程图解
2019/10/15 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
自我评价的正确写法
2013/09/19 职场文书
高中生毕业自我鉴定
2013/10/10 职场文书
学生个人的自我评价分享
2013/11/05 职场文书
村委会主任先进事迹
2014/01/15 职场文书
低碳生活倡议书
2014/04/14 职场文书
环保倡议书100字
2014/05/15 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
《假如》教学反思
2016/02/17 职场文书
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang