计算数组中每个数字出现多少次--“Bucket”桶的思想
2017-12-13 09:20
309 查看
题目:
解法一:比较元素是否相等
思路说明:这种应该是普通人最先想到的解法,先获取到数组之后进行有小到大排序,然后初始化一个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”桶的思想
- 将数组A中的内容和数组B中的内容进行交换,计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,1到 100 的所有整数中出现多少次数字9。
- 计算数组中每个数字出现的次数
- 定义一个16位长整型数,统计里面0~9每个数字出现的次数。(包括将长整型转化为字符数组的方法及switch的用法)
- leetcode 233. Number of Digit One 从1到n的数组中出现数字1的数量 + 寻找规律,公式计算
- 计算1~100的所有整数中出现多少次数字9
- 1、在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。设计一个算法,找出出现次数最多的数字。
- 计算一串数字中每个数字出现的次数
- asp.net计算一串数字中每个数字出现的次数
- 给定数组A,大小为n,数组元素为1到n的数字,统计哪些数字没有出现,哪些数字出现了多少次
- 一个整数数组,每个数字都出现K次,只有一个数字出现M次,找出这个数字(线性时间)
- 【C语言】计算输入整数中每个数字出现的次数
- BZOJ 1833: [ZJOI2010]count 数字计数(在[a,b]中的所有整数中,每个数码(digit)各出现了多少次)
- 输出一个整数的每一位,计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,编写程序数一下 1到 100 的所有整数中出现多少次数字 9
- js计算数组中每个元素出现的次数
- 计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?
- java牛牛新买了一本算法书,算法书一共有n页,页码从1到n。牛牛于是想了一个算法题目:在这本算法书页码中0~9每个数字分别出现了多少次?
- 【leetcode】在一堆每个数字都出现三次的数组中,找到那个只出现一次的数(Single Number II)
- 每天一道LeetCode-----数组序列,每个元素的值表示最多可以向后跳多远,计算最少跳多少次可以到达末尾