K个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路:
- 采用递归的方法。按K个节点一组向后推进,直到剩下的节点少于K;
- 从链表后端往前,把每组节点传入reverse进行翻转;
- reverse将第一个节点指向末尾 tail,然后第二个节点指向第一个节点,第三个节点指向第二个节点…此时得到该组反转后的链表。reverse返回反转后链表的链表头;
- 该链表头回到reverseKGroup后,被作为下一次reverse的tail,这样一组接一组就可以连成一整个链表了。
1 | class Solution: |
串联所有单词的字符
给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。
示例 1:
输入:
s = “barfoothefoobarman”,
words = [“foo”,”bar”]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 “barfoo” 和 “foobar” 。
输出的顺序不重要, [9,0] 也是有效答案。示例 2:
输入:
s = “wordgoodgoodgoodbestword”,
words = [“word”,”good”,”best”,”word”]
输出:[]
思路:
- 一开始我想的是对words全排列,然后在s上滑动窗口。提交之后超时了,确实还是复杂度太高了。看了其他的题解发现可以用colletions库中的Count快速实现。collections库我不太清楚,所以后面还会跟一个collection库的学习笔记。
- 首先先从collection import Count,将words列表变成一个Count字典,此时words里只有” 单词 : 它在words中的个数”
- i=0 开始向后遍历,得到每组子串为 s[i:i+words的长度]
- 由于words中每个单词的长度都一样,所以把当前子串按照单词长度拆开,变成Count字典,即可得到当前子串的” 单词:数量 “
- 将子串和words的Count字典比较,如果两个一致则当前子串是个“串联所有单词的字符”。
1 | class Solution: |
Collection库
namedtuple()
命名元组赋予每个位置一个含义,提供可读性和自文档性。它们可以用于任何普通元组,并添加了通过名字获取值的能力,通过索引值也是可以的。
1 | Point=nametuple("Point",['x','y']) |
ChainMap
1 | baseline = {'music': 'bach', 'art': 'rembrandt'} |
ChainMap 的作用是将多个字典组合在一起,虽然创建一个新字典或者原字典update也可以实现这个功能,但比起通过ChainMap实现还是慢了很多。
可以通过key输出值,不过若被连接的两个字典有同样的key,仅输出前一个字典的value
Counter
1 | cnt = Counter() |
Counter用于将输入列表的单词和单词频率以字典形式返回。Counter操作的对象必须是可哈希的,元组、字符串、number类都是可哈希的对象,而列表、字典是不可哈希的。
之前做过一道单词统计题,show-me-the-code(python)第 0004 题:任一个英文的纯文本文件,统计其中的单词出现的个数。就可以使用Counter来做。
1 | with open(filepath, 'r', encoding='utf-8') as f: |
defaultdict
是一个可以指定默认值的字典类型,和传统dic相比就多了这个功能,其他的都一样。
1 | s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] |
defaultdict通过重写missing实现这个功能,创建defaultdict对象时,括号中参数为default_factory,若missing函数找不到当前键值,将该键的值设为default_factory,随后返回。