持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目提示
- 链表中节点数为n
- 1 <= n <= 104
- 0 <= Node.val < n
- Node.val 中所有值 不同
- 1 <= nums.length <= n
- 0 <= nums[i] < n
- nums 中所有值 不同
二、思路分析:
我们今天拿到本题是 leetcode 难度为中等题 817. 链表组件。题目要求在链表中,找到能组成nums列表的组件,返回组件个数。什么是组件?
- 组件是链表中一段连续的结点的值构成的集合,同时该结点值在nums列表中的
- 链表中要找到构成nums的结点集合,存在对照关系,可以引入哈希表提前处理
- 判断链表中的组件情况,需要判断结点的值在nums中且前一个结点不存在nums中;
根据题目内容,我们可以使用哈希表的方式来构建映射关系解答本题,思路如下:
-
方法一:列表索引构建哈希
- nums的值需要提前记录存在与否的关系,可以使用索引排序方式
- 需要提前把nums的元素在长度为10^4的临时列表indexlist中,转换成indexlist[num]==1的关系,其他索引位置赋值为0
- 同时引入pre变量记录head前一个节点的值在nums状态,初始化为0
- 遍历整个链表,当per为0,且indexlist[head.val]值为1时,则为一个组件,组件次数ans+1
- pre指针值更新为indexlist[head.val],head指针继续向右移动,直到head为空结点退出循环
class Solution(object): def numComponents(self, head, nums): """ :type head: ListNode :type nums: List[int] :rtype: int """ indexlist = [0]*10001 for num in nums: indexlist[num] = 1 ans,pre = 0,0 while head: if pre == 0 and indexlist[head.val] == 1:ans +=1 pre = indexlist[head.val] head = head.next return ans -
方法二:集合构建哈希
- 本题需要找到组件的次数,因此只需要找到一段连续结点中出现nums中不存在的结点情况
- 我们只需要使用set()对nums列表进行除去重复元素即可,并将pre的值初始化False状态
- 遍历整个链表,当head.val不存在集合中,pre值更新为False
- 当head.val存在集合,并且组件次数ans+1,同时将pre值更新为True
class Solution(object): def numComponents(self, head, nums): numset = set(nums) pre = False ans = 0 while head: if head.val not in numset: pre = False elif not pre: ans +=1 pre = True head = head.next return ans
三、总结:
本题是一道关于链表找集合的问题,需要理清题目要求是一段连续的node节点,因此借助一个状态值pre来存储head指针所指的节点值在nums的存在状态来进行判断,前提可以使用哈希表来创建对照关系,AC提交记录如下:
- 时间复杂度:O(n),需要遍历链表
- 空间复杂度:O(n),需要创建链表长度的列表空间
以上是本期内容,欢迎大佬们点赞评论,下期见~~~