1. 问题描述:
给你一个整数数组 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
2. 思路分析:
① 首先是需要对列表中的数字进行计数,因为使用的python语言,所以可以使用collections.Counter方法将其转换为字典的形式进行计数,计数之后我们可以对得到得到的字典中的值使用list方法将其转换为列表,并且再次使用collections.Counter方法对列表中的值进行计数,看一下字典中的值是否只出现一次,所以我们只需要遍历字典中的值看是否大于1,假如大于了1那么肯定是False的,最后所有的都是只出现一次那么返回True
② 在领扣的题解中可以使用这样的解法:对于列表中的数字进行计数的之后,使用set集合来处理字典中的值,假如值出现的次数是一样的那么经过set函数之后那么得到的长度肯定是小于原来的列表的长度的,所以只需要判断这两者的长度是否是一样的即可
3. 代码如下:
我自己写的:
import collections
from typing import List
class Solution:
def uniqueOccurrences(self, arr: List[int]) -> bool:
arr = collections.Counter(arr)
# 使用异或操作判断是否存在同样的数字
arr = collections.Counter(list(arr.values()))
# 判断每一个值是否只出现一次假如只出现一次那么返回True
for cur in arr.values():
if cur > 1: return False
return True
题解代码:
import collections
from typing import List
class Solution:
# 使用set集合来判断会更加方便: 假如字典中的值存在了相同的那么得到的长度肯定是小于了原来列表的长度的
def uniqueOccurrences(self, arr: List[int]) -> bool:
arr = collections.Counter(arr)
return len(set(arr.values())) == len(arr)