LC 344 反转字符串
经过链表的拷打,这题自动联想到双指针+缓存变量的方法。
class Solution:
def reverseString(self, s: List[str]) -> None:
left , right = 0 , len(s) -1
while left <= right:
temp = s[left]
s[left] = s[right]
s[right] = temp
left += 1
right -= 1
查看题解,发现有更简洁的写法,python多元赋值,可以不用临时变量:
class Solution:
def reverseString(self, s: List[str]) -> None:
left , right = 0 , len(s) -1
while left <= right:
s[left] , s[right] = s[right] ,s[left]
left += 1
right -= 1
LC 541 反转字符串Ⅱ
自己写时陷入了思维定势,写for循环时默认i以1的步长遍历,导致代码冗余还提交报错了。
看了讲解发现本题实际上就是以2k为步长遍历字符串,然后操作s[i:i+k]子区间,反转其中的元素。
class Solution:
def reverseStr(self, s: str, k: int) -> str:
def reverse_substring(ls):
left, right = 0, len(ls) - 1
while left < right:
ls[left], ls[right] = ls[right], ls[left]
left += 1
right -= 1
return ls
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)
倒数第二行遍历的代码,用到了python里字符串切片的一个特性,
即:对于字符串s = 'abc',如果使用s[0:999] 会返回'abc'。字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以不管最后一步,若剩下的字符串不够k长怎么处理,他都会全部反转。
卡玛54 替换数字
自己做时,是从前往后逐个遍历,替换数字。
ls = ['0','1','2','3','4','5','6','7','8','9']
s = input()
def func():
temp =''
for i in s:
if i not in ls:
temp += i
else:
temp += 'number'
print(temp)
func()
题解使用了isdigit()和join()函数,平时用的比较少,这里熟悉一下。
isdigit():检测字符串中是否有数字,若有,返回True
symbol.join(sequence):将sequence中的元素用sybol连接起来,返回链接后的字符串。
比如:
s='abc'
symbol = '*'
print(symbol.join(s))
print(symbol.join(list(s)))
输出的都是a*b*c
s = input()
def func():
ls = list(s)
for i in range(len(s)):
if ls[i].isdigit():
ls[i] = 'number'
print(''.join(ls))
func()
需要注意的是,python里的字符串不能直接修改(因此本题必须使用额外空间),因此需要先转换成列表,再修改列表的元素。若直接for i in ls, i = 'number',试图直接修改字符串的话,不会产生任何效果!!只有通过ls[i]修改列表,才可以。