携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
groupSizes.length == n1 <= n <= 5001 <= groupSizes[i] <= n
二、思路分析:
我们拿到本题,读取题目内容要求对对n个用户进行分组,第i个人所在的组需要满足groupsize[i]人数中。看着题目,怎么比较拗口呢,那我们继续审题:
- groupSizes中索引代表n个人的ID
- groupSize[i] 中分组的人数
- 根据每个人idex分组和人数分配到对应组
- 每一个ID的人只能出现一个组中,且所在的组的人数也必须一致
根据题目的要求,因此对该题的解答我们可以使用哈希表的方式模拟解答即可,思路大致如下:
- 根据groupSize中每小组的人数group作为key,用户ID列表作为value,定义一个groupdict
- 使用for循环遍历groupSize中group不在groupdict.keys(),则groupdict[key]=[idex]
- 当group在groupdict.keys()中,则添加到groupdict[key].append(idex)
- 当group与len(groupdict[key])时,说明该小组分配完成添加到ans列表中,并删除groupdict.pop(group)
- 根据以上思路,我们能快速使用python实现,代码如下:
class Solution(object): def groupThePeople(self, groupSizes): """ :type groupSizes: List[int] :rtype: List[List[int]] """ groupdict = {} ans = [] for idx,group in enumerate(groupSizes): if group not in groupdict.keys(): groupdict[group] = [idx] else: groupdict[group].append(idx) if len(groupdict[group])== group: ans.append(groupdict[group]) groupdict.pop(group) return ans
学习了一下,大佬们的优雅代码,get到本题中一个新的知识点:创建默认字典:
在一般情况下,我们创建字典有如下几种形式:
- 默认空字典:tmp = {}
- 使用dict():tmp = dict()
- 使用zip()与dict(): tmp = dict(zip(list1,list2))
- 使用Counter():tmp = Counter(list1) # 创建计算出list元素出现的次数
- 使用defaultdict(): tmp = defaultdict(list)# 创建value为列表的默认字典
class Solution(object):
def groupThePeople(self, groupSizes):
"""
:type groupSizes: List[int]
:rtype: List[List[int]]
"""
groups = defaultdict(list)
for i, size in enumerate(groupSizes):
groups[size].append(i)
ans = []
for size, people in groups.items():
ans.extend(people[i: i + size] for i in range(0, len(people), size))
return ans
三、总结:
本题考察我们使用哈希表键值对思想,对groupSize进行分组。我们可以使用defaultdict()创建默认以list为value的字典,在分组时使用extend进行追加,AC提交记录如下:
- 时间复杂度:O(n),n为groupSize的长度
- 空间复杂度:O(n),n为groupSize的长度
以上是本期内容,欢迎大佬们点赞评论,下期见~~