代码随想录算法训练营Day 08|字符串Part01|344.反转字符串 、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串
文章目录
344.反转字符串
一、双指针法
1.for循环
class Solution(object):
def reverseString(self, s):
"""
:type s: List[str]
:rtype: None Do not return anything, modify s in-place instead.
"""
#双指针法
left = 0
right = len(s)-1
for i in range(len(s)//2):
s[left],s[right] = s[right],s[left]
left +=1
right -=1
return s
2.while循环
class Solution(object):
def reverseString(self, s):
"""
:type s: List[str]
:rtype: None Do not return anything, modify s in-place instead.
"""
left = 0
right = len(s) -1
while(left<right):
s[left],s[right] = s[right],s[left]
left += 1
right -=1
return s
二、栈
class Solution(object):
def reverseString(self, s):
"""
:type s: List[str]
:rtype: None Do not return anything, modify s in-place instead.
"""
# 栈
stack = []
for i in s:
stack.append(i)
for i in range(len(s)):
s[i] = stack.pop()
return s
三、本题总结
so easy!
541. 反转字符串II
一、双指针法
class Solution(object):
def reverseStr(self, s, k):
"""
:type s: str
:type k: int
:rtype: str
"""
def reversek(string):
left = 0
right = len(string)-1
while(left<right):
string[left],string[right] = string[right],string[left]
left += 1
right -=1
return string
string = list(s)
for i in range(0,len(string),2*k):
string[i:i+k] = reversek(string[i:i+k])
return ''.join(string)
- 使用range(start, end, step)来确定需要调换的初始位置
- 对于字符串s = ‘abc’,如果使用s[0:999] ===> ‘abc’。字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
- 用切片整体替换,而不是一个个替换.
二、直接使用切片逆转操作
class Solution(object):
def reverseStr(self, s, k):
"""
:type s: str
:type k: int
:rtype: str
"""
# 创建一个空字符串用于存放最终结果
result = ""
# 遍历字符串,步长为2k
for i in range(0, len(s), 2*k):
# 取出当前2k区间内的前k个字符进行逆转,后k个字符保持不变
# 使用切片逆转前k个字符,切片操作会生成一个新的字符串
part1 = s[i:i+k][::-1]
part2 = s[i+k:i+2*k]
# 将处理后的子字符串加到结果字符串中
result += part1 + part2
return result
这个直接使用字符串的[::-1]操作
三、本题总结
本题注意指针的移动间隔为2*k会简便许多
卡码网:54.替换数字
一、存入数组后替换
class Solution():
def replace(self,s):
x = []
for i in range(len(s)):
x.append(s[i])
for i in range(len(x)):
if x[i].isdigit():
x[i] = 'number'
return ''.join(x)
sol = Solution()
s = input()
result = sol.replace(s)
print(result)
二、c++写法 双指针
需扩展空间
#include<iostream>
using namespace std;
int main() {
string s;
while (cin >> s) {
int count = 0; // 统计数字的个数
int sOldSize = s.size();
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
count++;
}
}
// 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
s.resize(s.size() + count * 5);
int sNewSize = s.size();
// 从后先前将空格替换为"number"
for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
if (s[j] > '9' || s[j] < '0') {
s[i] = s[j];
} else {
s[i] = 'r';
s[i - 1] = 'e';
s[i - 2] = 'b';
s[i - 3] = 'm';
s[i - 4] = 'u';
s[i - 5] = 'n';
i -= 5;
}
}
cout << s << endl;
}
}
三、本题总结
python解法很简单,但是要注意acm模式的写法
151.翻转字符串里的单词
一、分割为数组再双指针翻转
class Solution(object):
def reverseWords(self, s):
"""
:type s: str
:rtype: str
"""
words =s.split()
left =0
right =len(words)-1
while(left<right):
words[left],words[right] = words[right],words[left]
left +=1
right -=1
return ' '.join(words) #注意这里有个空格
二、简洁版
class Solution(object):
def reverseWords(self, s):
"""
:type s: str
:rtype: str
"""
return ' '.join(s.strip().split()[::-1])
三、本题总结
注意join的操作
卡码网:55.右旋转字符串
一、切片
k = int(input())
s = input()
#通过切片反转第一段和第二段字符串
#注意:python中字符串是不可变的,所以也需要额外空间
s = s[len(s)-k:] + s[:len(s)-k]
print(s)
)