344. 反转字符串 - 简单
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
def reverseString( self, s:List[str])->None:
"""
Do not return anything, modify s in-place instead.
"""
left, right = 0, len(s) - 1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
思路:
1. 用双指针法,swap头和尾。头的index用0表示,尾的index用len(s)-1表示。
2. 在 while loop 条件下,swap头和尾时可以直接赋值转换。
3. 完成这一次后,头指针向后移动一位,尾指针向前移动一位,继续后面的swap。
541. 反转字符串II - 简单
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
方法一:
def reverseStr(self, s:str, k:int) -> str:
p = 0
for p < len(s):
s = s[:p] + s[p:p+k][::-1] + s[p+k:]
# 每2k个字符操作一次
p = p + 2 * k
return s
思路:
使用python的切片。
考虑到之后的循环,p之前的不动,s[:p]
p到p+k的部分,用s[p:p+k][::-1]倒序。
p+k之后的不动,s[p+k:]
p = p + 2*k,继续循环,达到每2k个操作一次的要求,p初始化为0。
知识点:
python的[::-1]的几种用法_python [::-1]-CSDN博客
[start : end : step]
start:开始下标,从0开始
end:结束下标,不包含该下标
step:步长,步长为正时,从左向右取值。步长为负时,从右向左取值
注意:步长不可以为0
方法二:
def reverseStr(self, s:str, k:int) -> str:
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
result = list()
for i in range(0, len(s), 2*k):
result[i:i+k] = reverse_substring(result[i:i+k])
return ''.join(result)
思路:
先自定义基础函数reverse,即344答案
之后用for循环进行每2k个遍历,替换。
卡码网 54. 替换数字
class Solution:
def change(self, s):
# Python里面的string也是不可改的,所以也是需要额外空间的。空间复杂度:O(n)。
lst = list(s)
for i in range(len(lst)):
if lst[i].isdigit():
lst[i]="number"
return "".join(lst)
思路:先将 string转化成list,然后用for循环遍历判断每一个list中的元素,检查是否为数字,若是则可以用"number"顶替。有两个关键的函数的使用方式需要掌握。
知识点:
1. list() 可将字符串转换为列表
>>>test =list(cat) >>>test [c,a,t]
2. Python 中的 isdigit() 函数的用法:
判断单个字符是否为数字; 判断字符串中是否仅含有数字
151. 反转字符串中的单词
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
输入:s = "the sky is blue
" 输出:"blue is sky the
"
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)
用x.split将句子split成词,套用reverse函数,最后用“ ”.join()将words列表中的词连接成以空格为间隔的句子。
卡码网55:右旋字符串
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。
k = int(input())
s = input()
s = s[len(s)-k:] + s[:len(s)-k]
print(s)
思路:在len(s)-k处做切片,该index之前的用s[:len(s)-k]表示,该index之后的用s[len(s)-k:]表示