互联网行业的小白,写博客的目的是为了记录自己的学习过程、对自己学习中所犯的错误做一个总结。由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!
题目描述
题目传送门:独一无二的出现次数
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
示例 1:
输入:arr = [1,2,2,1,1,3]
输出:true
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。
示例 2:
输入:arr = [1,2]
输出:false
示例 3:
输入:arr = [-3,0,1,-3,1,1,1,-3,10,0]
输出:true
提示:
1 <= arr.length <= 1000-1000 <= arr[i] <= 1000
题解
| 暴力实现 |
建立一个范围为-1000到1000的数组hash,遍历arr,对arr的元素计数,在遍历一遍hash,找是否存在相同的两个不为0的数即可。
AC代码
class Solution:
def uniqueOccurrences(self, arr: List[int]) -> bool:
hash = [0] * 2005
for i in arr:
hash[i] += 1
for i, j in enumerate(hash):
for m, n in enumerate(hash):
if m != i and j == n and n != 0:
return False
return True
用此这种势必会消耗大量的时间和空间了
下面采用另外一种方式
| 排序+集合 |
先排序数组,然后扫描每一个元素的出现次数并加入set,发现重复次数时返回false,遍历结束后返回true。
AC代码
class Solution:
def uniqueOccurrences(self, arr: List[int]) -> bool:
count = [0] * 2005
for i in arr:
count[i] += 1
count.sort(reverse = True)
set1 = set()
for i in count:
if i == 0:
break
else:
if i in set1:
return False
else:
set1.add(i)
return True
你还记得集合的去重功能吗?还可以这样解:
先计算每个数出现的次数,放在数组hash中,再遍历hash中的数放入集合set中,由于集合的去重性,只需判断hash和set的长度即可。
AC代码
class Solution:
def uniqueOccurrences(self, arr: List[int]) -> bool:
count = [0] * 2005
for i in arr:
count[i] += 1
cnt = 0 # 记录数组的长度,为0的元素不算在内
set1 = set()
for i in count:
if i == 0:
continue
cnt += 1
set1.add(i)
if cnt == len(set1):
return True
else:
return False
另一种写法:
collections.Counter(arr)是python中的计数函数,不容易记住,所以不推荐使用啦
class Solution:
def uniqueOccurrences(self, arr: List[int]) -> bool:
collect = collections.Counter(arr)
lst = []
for i in collect.values():
lst.append(i)
if len(lst) == len(set(lst)):
return True
return False

码字不易,您的
支持就是我坚持下去的动力,一起加油哦。
本文探讨了一道编程题——如何判断一个整数数组中每个数的出现次数是否各不相同。提供了几种解决方案,包括暴力实现、排序加集合的方法以及利用集合的去重特性进行优化。
574

被折叠的 条评论
为什么被折叠?



