541 反转字符串主要掌握快速遍历所需位置,采用i += k的步长走,而不是i += 1慢慢挪动
并且掌握python的切片操作(py的字符串不允许直接修改,我是采用先转列表再转回来,卡哥直接采用拼接的方式),贴出卡哥的代码美如画
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
151 翻转字符串里的单词,以下是不调用.strip()还有.split()的写法
class Solution(object):
def reverseWords(self, s):
"""
:type s: str
:rtype: str
"""
s = list(s)
self.my_reverse(s, 0, len(s) - 1)
letter_bef = ' '
for i in range(len(s)):
if s[i] != ' ' and letter_bef == ' ':
word_beg = i
if s[i] == ' ' and letter_bef != ' ':
word_end = i - 1
self.my_reverse(s, word_beg, word_end)
letter_bef = s[i]
if letter_bef != ' ':
self.my_reverse(s, word_beg, len(s) - 1)
# print("\"", ''.join(s), "\"", sep='')
# 去空格
j = 0
kg = 0 # 空格数
beg = True
for i in range(len(s)):
if s[i] != ' ':
beg = False
kg = 0
s[j] = s[i]
j += 1
end_ = j
elif kg == 0 and not beg:
s[j] = s[i]
j += 1
kg += 1
else:
continue
# print("\"", ''.join(s[:end_]), "\"", sep='')
return ''.join(s[:end_])
def my_reverse(self, s, left, right):
i = left
for i in range(left, (left + right) // 2 + 1):
temp = s[i]
s[i] = s[left + right - i]
s[left + right - i] = temp
if __name__ == '__main__':
s = Solution()
print("\"", s.reverseWords(s=" hello world "), "\"", sep='')
如果要直接复制的话,注意把print中的打印引号去掉,我也是为了方便自己调试的
再看看调用api的,很夸张了这个长度对比
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
卡码网55 右旋字符串的话就刷过好几次了,总的翻转再进行内部两次局部小翻转easypeasy