代码随想录刷题第八天
字符串注意:
Python字符串无法原地修改内容,只可以将字符串改成列表的格式,然后通过"".join(list)
将修改后的列表重构为字符串。
反转字符串 (LC 344)
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1)
的额外空间解决这一问题。
示例:
输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
本题使用左右双指针,将左右的内容对调。简单!
代码实现
class Solution(object):
def reverseString(self, s):
left = 0
right = len(s)-1
while(left<right):
s[left], s[right] = s[right], s[left]
left, right = left+1, right-1
反转字符串II (LC 541)
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
我的思路
class Solution(object):
def reverseStr(self, s, k):
i = 0
res = []
# 当前下标是否小于len(s),以及当前下标到末尾只有不到2k长度了
while (i<len(s) and len(s)-2*k-i>=0):
#反转前k个
start = i+k-1
while (start>=i):
res.append(s[start])
start-=1
#保留后k个
start = i+k
for j in range(i+k, i+2*k):
res.append(s[j])
i+=2*k
# while循环结束,剩下的长度只剩不到2k
if len(s)-i < 2*k:
left = i
if len(s)-i<k:
# 如果在0-k, 反转所有剩下的
start = len(s)-1
else:
# 如果在k-2k, 反转前k个
start = i+k-1
# 开始反转
while(start>=i):
res.append(s[start])
start-=1
# 如果在k-2k, 保留后k个
if len(s)-i>k:
for j in range(i+k, len(s)):
res.append(s[j])
# list转str
res = "".join(res)
return res
卡哥思路:
可以使用列表切片的方式,在原字符串重构的列表上原地更改顺序。使用第一题的左右双指针完成对前k个值的反转,后k个值不需要动。** Python 切片如果结束索引超出列表的长度,切片操作将截取到列表的末尾。即如果最后只剩下不到k个元素,即使截取i+k, 也只会返回到列表末尾**
代码实现如下:
class Solution(object):
def reverseStr(self, s, k):
res = list(s)
for i in range(0, len(s), 2*k):
# 由于在原来的列表中修改,只需要考虑前k个值
res[i:i+k] = self.reverse(res[i:i+k])
'''
Python的切片操作通常是安全的
如果结束索引超出列表的长度,切片操作将截取到列表的末尾。
即如果最后只剩下不到k个元素,即使截取i+k, 也只会返回到列表末尾
'''
res = "".join(res)
return res
def reverse(self, s):
left, right = 0, len(s)-1
while (left < right):
s[left], s[right] = s[right], s[left]
left+=1
right-=1
return s
替换数字 (卡码网)
给定一个字符串 s
,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number
。
例如,对于输入字符串 "a1b2c3"
,函数应该将其转换为 "anumberbnumbercnumber"
。
样例输入:a1b2c3
样例输出:anumberbnumbercnumber
Python 由于无法直接修改字符串,所以只可以将字符串转换成列表,然后通过遍历列表内的字符,如果字符是数字 (isdigit()
),则修改这个字符为 number
.最后通过"".join(list)
重构字符串。
**注意,在卡码网中需要将input
储存在一个变量中,使用variable = type(input())
储存,type
包括int, str, list...
.
代码实现
s = str(input())
result = []
for char in s:
if char.isdigit(): # 检查字符是否是数字
result.append('number')
else:
result.append(char)
result = ''.join(result)
print(result)
翻转字符串里的单词 (LC 151)
给你一个字符串 s
,请你反转字符串中 单词
的顺序。
示例:
输入:s = “the sky is blue”
输出:“blue is sky the”
输入:s = " hello world "
输出:“world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。
Python无法原地变更字符串,所以这题比较简单,使用string.split()
将一个字符串根据空格差分,转换为列表,然后选择双指针,或者从后往前遍历将列表反转,最后再用" ".join(list)
将列表元素转换成用空格分隔的字符串。
代码实现
class Solution(object):
def reverseWords(self, s):
# split函数将字符串按照空格分割成list
words = s.split()
left, right = 0, len(words)-1
while (left < right):
words[left], words[right] = words[right], words[left]
left+=1
right-=1
# 或者使用内置函数返回
#words.reverse()
# list 重构 string, 记得用空格重构
res = " ".join(words)
return res
右旋字符串 (卡码网)
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s
和一个正整数 k
,请编写一个函数,将字符串中的后面 k
个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg"
和整数 2
,函数应该将其转换为 "fgabcde"
。
示例:
输入:2 abcdefg
输出:fgabcde
比较简单, 代码实现如下:
k = int(input())
T = list(input())
res = [0 for _ in range(len(T))]
res[0:k] = T[len(T)-k:len(T)]
res[k:len(T)] = T[0:len(T)-k]
res = "".join(res)
print(res)
总结:
由于Python的特性,字符串无法原地修改,所以Python字符串的题目只可以使用列表进行操作,题目比较简单!