344.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
back=len(s)-1
first=0
tt=(back+1)//2
for i in range(tt):
s[first],s[back]=s[back],s[first]
first+=1
back-=1
return s
这道题需要绕一个弯,这个弯是我学python如此长的时间,一直绕不出来的一个弯。
s[first],s[back]=s[back],s[first],此句话表示的是数组中两个数的同时交换,我以前一直以为不能这样做,做了此道题之后,我才知道可以这样操作。
541. 反转字符串II
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
这道题我踩的有坑。
运行代码:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
def hanshu(ff):
left = 0
right = len(ff)-1
dd = ff
while left<right:
dd[left],dd[right]=dd[right],dd[left]
left+=1
right-=1
return dd
fff=list(s)
for i in range(0,len(s),2*k):
fff[i:i+k]=hanshu(fff[i:i+k])
return ''.join(fff)
这道题题目很复杂,逻辑很简单。
(1)在【344.反转字符串】的基础上,多加了一个for循环。
(2)主要考察的是对 for i in range(0,len(s),2*k)中间隔2*k的用法。
(3)题目中说的“如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。” 就是表达一个意思:小于k的要反转,用一层for循环就解决。
踩坑1:
for i in range(0,len(s),2*k)循环不会用,没想到这一思路。
踩坑2:
我当时做的时候:
将fff全部字符传入函数中,全部反转。执行fff[i:i+k]=rrr后,会替换k=2的两个字符。这是我debug后才明白的。(下第二张图展示)
题目:剑指Offer 05.替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1: 输入:s = "We are happy."
输出:"We%20are%20happy."
自己写的运行代码:
class Solution:
def replaceSpace(self, s: str) -> str:
left_len=len(s)
counter=s.count(' ')
fff = list(s)
fff.extend([" "]*counter*2)
right=len(fff)-1
left=left_len-1
while left>=0:
if fff[left]!=' ':
fff[right]=fff[left]
right-=1
elif fff[left]==" ":
fff[right]='0'
right-=1
fff[right]='2'
right-=1
fff[right]='%'
right-=1
left -= 1
return ''.join(fff)
此道题思路也比较简单:
(1)将字符串转为列表;
(2)运用列表extend函数,对列表扩展,最终需要长度。
(3)建立while循环语句,两个指针慢慢挪;
(4)最近使用''.join(fff)语句将列表转为字符串。(这里我当时踩了一个坑,在''中间,加了一个空格,使得输出出现了问题,如下图所示)
151.翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
我当时看错题目:写了下面代码(略):
class Solution:
def reverseWords(self, s: str) -> str:
def reverse_e(ff):
left=0
dd=len(ff)
right=len(ff)-1
for i in range(dd//2):
ff[left],ff[right]=ff[right],ff[left]
left+=1
right-=1
return ff
ss_list=list(s)
ddf=0
for i in range(len(ss_list)):
if ss_list[i] ==" ":
EE=ss_list[ddf:i]
FF=reverse_e(ss_list[ddf:i])
ss_list[ddf:i]=reverse_e(ss_list[ddf:i])
ddf = i+1
return ''.join(ss_list)
rr=Solution()
s = "We are happy."
# k = 2
# rr.reverseStr(s,k)
rr.reverseWords(s)
print(rr.reverseWords(s)) # Output: "bacdfeg"
调包的方法:
class Solution:
def reverseWords(self, s: str) -> str:
return ' '.join(s.split()[::-1])
我自己写的调包的方法(太拉跨):
class Solution:
def reverseWords(self, s: str) -> str:
ff=s.split()
s_len=len(ff)
left=0
right=s_len-1
yyy=ff[right]
for i in range(s_len//2):
ff[left],ff[right]=ff[right],ff[left]
left+=1
right-=1
return " ".join(ff)
踩坑1:
我最开始用的ff=s.split(' '),用空格分隔,如果给的字符串中有空格,最后会提取到'',并且提取到的''数量会比空格数量少1个(见下图2)。很难去除,我最后也没搞定这个问题。
(时间太少,不导包方法二刷)
剑指Offer58-II.左旋转字符串
def reverse(list_n,left,right):
while left<right:
list_n[left],list_n[right]=list_n[right],list_n[left]
left+=1
right-=1
res=list(s)
end=len(res)-1
reverse(res,0,n-1)
reverse(res,n,end)
reverse(res, 0, end)
return ''.join(res)
导函数解决方法如下:
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
s = list(s)
s[0:n] = list(reversed(s[0:n]))
s[n:] = list(reversed(s[n:]))
s.reverse()
return "".join(s)
踩坑1:
reverse(list_n,left,right),left和right需要传参,当时没想到。
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
# def reverse(list_n,left,right):
# while left<right:
# list_n[left],list_n[right]=list_n[right],list_n[left]
# left+=1
# right-=1
# res=list(s)
# end=len(res)-1
# reverse(res,0,n-1)
# reverse(res,n,end)
# reverse(res, 0, end)
#
# return ''.join(res)
tt=s[n:]
return s[n:]+s[0:n]
踩坑1:
当时没想到字符串可以做切片。