Leetcode 344
题目:反转字符串
学习资料:代码随想录
初始思路:
- 双指针方法,一个从头开始,一个从尾部开始;利用n//2来遍历
学习后:
- 利用while left < right的方法空间复杂度较低
#思路一
n = len(s)
for i in range(n//2):
j = n-i-1
temp = s[i]
s[i] = s[j]
s[j] = temp
#思路二
left, right = 0, len(s)-1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
Leetcode 541
题目:反转字符串2
学习资料:代码随想录
初始思路:
- 利用python中slice和[::-1]方法来实现;按照给出条件模拟
- 其实不用进行模拟,利用python的方法直接可以满足条件,但是要注意,str的不允许直接slice对slice赋值,所以需要字符串拼接
学习之后:
- 也可以再写一个函数来进行反转;不用字符串拼接的话,就需要先转为list,然后再join拼接
实现过程:
#思路一:
n = len(s)
for i in range(0, n, 2*k):
s = s[:i] + s[i:i+k][::-1] + s[i+k:]
return s
#思路二:
def reverse_substring(text):
left, right = 0, len(text) - 1
while left < right:
text[left], text[right] = text[right], text[left]
left += 1
right -= 1
return text
res = list(s)
for cur in range(0, len(s), 2 * k):
res[cur: cur + k] = reverse_substring(res[cur: cur + k])
return ''.join(res)
剑指offer 05
题目:替换空格
学习资料:代码随想录
初始思路:
- 使用replace或join的python方法
学习后
- 遍历到空格就替换,但是要从后往前替换,不然前面的都被覆盖了,覆盖,而且“%20”占用两个字符,会导致错乱;
- 其次,需要enumerate函数的,来标记,不然会被修改后的串影响
实现过程:
n = len(s)
for i,str1 in enumerate(s[::-1]):
print(i, str1)
if str1 == " ":
s = s[:n-i-1] + "%20" +s[n-i:]
return s
Leetcode151
题目:反转字符串中的单词
学习资料:代码随想录
初始思路
- 利用split函数自动去除所有的空格,提取出单词,反转,再拼接
学习之后
- 先把所有多余空格删掉,前后的多余空格利用while循环。中间的空格:如果不是空格加入到list中,如果是空格判断前一个是不是空格,如果不是也是合理的
- 反转整个字符串,这样单词的位置是反转了的,但是每个单词还是反转的
- 反转单词,通过空格来区分,start代表单词开始,end代表单词结束,就是遇到空格之前
- 过程有点繁琐,稍不注意就很容易写错
思路一:
l = s.split()
n = len(l)
left, right = 0, n-1
while left < right:
l[left], l[right] = l[right], l[left]
left += 1
right -= 1
return " ".join(l)
思路二:
tmp = self.removeSpace(s)
str1 = self.reverseString(tmp,0,len(tmp)-1)
n = len(str1)
start = end = 0
while start < n:
while end < n and str1[end] != " ":
end += 1
self.reverseString(str1, start, end-1)
start = end + 1
end += 1
return "".join(str1)
#remove space
def removeSpace(self, s):
n = len(s)
left, right = 0, n-1
# 去除头部空格
while s[left] == " " and left <= right:
left += 1
while s[right] == " " and left <= right:
right -= 1
tmp = []
while left <= right:
if s[left] != " ":
tmp.append(s[left])
elif tmp[-1] != " ":
tmp.append(s[left])
left += 1
return tmp
def reverseString(self,s, left, right):
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
return s
剑指offer58II
题目:左旋字符串
学习资料:代码随想录
初始思路:
- 遍历拼接;slice;join都可以实现
学习之后:
- 想要要求更多一点不用slice,就满足空间复杂度为1,然后在原有串上操作
- 思路就是,先反转前面n个,再反转后面剩余的,然后全部反转
实现过程
思路一:
re = ""
for i in range(n,len(s)):
re += s[i]
for i in range(n):
re += s[i]
return re
思路二:
s = list(s)
s[0:n] = list(reversed(s[0:n]))
s[n:] = list(reversed(s[n:]))
s.reverse()
return "".join(s)
总结
- 本次做了很多题,虽然每个题都能做出来,但是希望还是要多巩固一下,把这个双指针的思想能够更好的系统来使用,还需要消化消化。