双指针(2)
1.JZ58 I.翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
代码
翻转+拼接
class Solution:
def reverseWords(self, s: str) -> str:
#分割+倒序
s = s.strip() #删除首尾的空格
s1 = s.split() #分割,eg:['the','sky','is','blue']
s1.reverse() #翻转
return ' '.join(s1) #拼接
双指针
class Solution:
def reverseWords(self, s: str) -> str:
#双指针
s = s.strip() #删除首尾的空格
i = j = len(s) - 1
res =[]
while i >= 0:
while i >= 0 and s[i] != ' ':
i -= 1 #直到出现第一个空格,即i在空格时停止
res.append(s[i+1:j+1]) #保存s的i+1 到 j
while s[i] ==' ':
i -= 1 #知道i到下一个字母
j=i
return ' '.join(res)
2 JZ58 II左旋转字符串
JZ58 II左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"
示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
这个比较简单,感觉都不用双指针的方法
代码
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
end = len(s)
return s[n:end] + s[0:n]
总结
双指针算法是常用于解决需要遍历数组的问题的一种编程思想(有时也可用于链表中),采用两个指针联动配合的方式实现在数组中搜索所需结果的目的,其灵活性与高效性不仅提高了代码效率,而且使编程思路清晰。
常见的双指针算法可以分为三大类:
- 左右双指针算法(最常见):一个指向头部,一个指向尾部,两头从中间逼近,直到满足条件或相遇为止,eg,二分查找
- 快慢双指针算法:两指针初始位置相同,但前进的速度不同或者fast先移动k步,一般用于链表求环,链表求中点(或第k节点),查找等
- 后序双指针算法:数组重组问题
在解决不同问题时需要通过具体分析选择相应的双指针,可以大大降低时空复杂度。