本文目录
344.反转字符串
代码随想录:344.反转字符串
Leetcode:344.反转字符串
做题
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
size = len(s)
left = 0
right = size - 1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
return s
时间复杂度: O(n)
空间复杂度: O(1)
看文章
这个功能用库函数就可以实现,但在实际面试中:
- 如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。
- 如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。
反转(库函数): s[:] = reversed(s)
541. 反转字符串II
代码随想录:541. 反转字符串II
Leetcode:541. 反转字符串II
做题
分情况,分别实现反转。
class Solution:
def reverseStr(self, s: str, k: int) -> str:
size = len(s)
left, right = 0, 0
a = list(s)
while right < size:
if right + 2 * k - 1 < size:
temp = right + 2 * k
right = right + k - 1
while left < right:
a[left], a[right] = a[right], a[left]
left += 1
right -= 1
left, right = temp, temp
elif right + k - 1 < size:
right = right + k - 1
while left < right:
a[left], a[right] = a[right], a[left]
left += 1
right -= 1
left, right = size, size
else:
right = size - 1
while left < right:
a[left], a[right] = a[right], a[left]
left += 1
right -= 1
break
return ''.join(a)
时间复杂度: O(n)
空间复杂度: O(1)或O(n),取决于使用的语言中字符串是否可以修改,python无法修改,所以说O(n)
看文章
反转操作整理成函数
class Solution:
def reverseStr(self, s: str, k: int) -> str:
"""
1. 使用range(start, end, step)来确定需要调换的初始位置
2. 对于字符串s = 'abc',如果使用s[0:999] ===> 'abc'。字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
3. 用切片整体替换,而不是一个个替换.
"""
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)
更简洁版
class Solution:
def reverseStr(self, s: str, k: int) -> str:
# Two pointers. Another is inside the loop.
p = 0
while p < len(s):
p2 = p + k
# Written in this could be more pythonic.
s = s[:p] + s[p: p2][::-1] + s[p2:]
p = p + 2 * k
return s
卡码网:54.替换数字
做题
思路能想到,但不知道怎么判断是字母还是数字。
看文章
如果使用C++,因为C++的string可以修改,故可以不需要额外空间,实现空间复杂度为O(1)的算法。但Java、Python都是不能修改的。具体代码如下:
class Solution:
def change(self, s):
lst = list(s)
for i in range(len(lst)):
if lst[i].isdigit():
lst[i] = "number"
return ''.join(lst)
Python中,判断数字的函数是.isdigit(),判断字母的函数是.isalpha()。
时间复杂度: O(n)
空间复杂度: O(n)
151.翻转字符串里的单词
代码随想录:151.翻转字符串里的单词
Leetcode:151.翻转字符串里的单词
做题
字符串的基础函数不熟。
看文章
与上一题一样,python的字符串不可变,故空间复杂度无法做到O(1)。
先删除空白,然后整个反转,最后单词反转
class Solution:
def reverseWords(self, s: str) -> str:
# 删除前后空白
s = s.strip()
# 反转整个字符串
s = s[::-1]
# 将字符串拆分为单词,并反转每个单词
s = ' '.join(word[::-1] for word in s.split())
return s
使用双指针
class Solution:
def reverseWords(self, s: str) -> str:
# 将字符串拆分为单词,即转换成列表类型
words = s.split()
# 反转单词
left, right = 0, len(words) - 1
while left < right:
words[left], words[right] = words[right], words[left]
left += 1
right -= 1
# 将列表转换成字符串
return " ".join(words)
卡码网:55.右旋
做题
k = int(input())
s = input()
res = []
size = len(s)
for i in range(size - k, size):
res.append(s[i])
for i in range(size - k):
res.append(s[i])
print(''.join(res))
看文章
与上一题一样,python的字符串不可变,故空间复杂度无法做到O(1)。
#获取输入的数字k和字符串
k = int(input())
s = input()
#通过切片反转第一段和第二段字符串
#注意:python中字符串是不可变的,所以也需要额外空间
s = s[len(s)-k:] + s[:len(s)-k]
print(s)
以往忽略的知识点小结
- Python常见库函数:(s是字符串,a是char)
- 反转:s[:] = reversed(s)
- 判断数字:a.isdigit()
- 判断字母:a.isalpha()
- 去除字符串两端的指定字符(默认为空白字符):s.strip()
- 将字符串拆分为单词列表:s.split()
- Python、Java的字符串不可修改,C++可以
个人体会
完成时间:3h30min。
心得:多熟悉Python基础库函数。