目录
(一)反转字符串
1. 题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
2. 思路
双指针一头一尾,二者互换。
3. 解题过程
难易程度:简单
标签:双指针、字符串
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0, right = s.size() - 1;
while(left < right){
swap(s[left++], s[right--]);
}
}
};
(二)反转字符串Ⅱ
1. 题目描述
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
2. 思路
每 2k 个字符判断一下剩下的少于 k 则反转全部,否则反转前 k 个,剩下的不足 2k 个就退出返回。
3. 解题过程
难易程度:简单
标签:双指针、字符串
class Solution {
public:
string reverseStr(string s, int k) {
int i = 0;
while(i < s.size()){
int left = i;
// 如果剩余少于k个,反转全部,否则反转前k个
int right = i + k < s.size() ? i + k - 1 : s.size() - 1;
while(left < right){
swap(s[left++], s[right--]);
}
// 剩余字符少于2k个,反转完退出
if(i + 2 * k > s.size()){
break;
}
// 否则计数下2k个字符
else{
i += 2 * k;
}
}
return s;
}
};
(三)替换数字
54. 替换数字(第八期模拟笔试) (kamacoder.com)
1. 题目描述
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
2. 思路
首先扩充数组到每个数字字符替换成 "number" 之后的大小,然后从后向前替换数字字符。
3. 解题过程
#include<iostream>
using namespace std;
int main(){
string s;
cin >> s;
int count = 0;
int n = s.size() - 1;
for(int i = 0; i <= n; i++){
// 统计数字个数
if(s[i] >= '0' && s[i] <= '9'){
count++;
}
}
s.resize(s.size() + count * 5);
int s_length = s.size() - 1;
while(s_length >= 0){
while(n >= 0){
// 是数字,替换成number
if(s[n] >= '0' && s[n] <= '9'){
s[s_length--] = 'r';
s[s_length--] = 'e';
s[s_length--] = 'b';
s[s_length--] = 'm';
s[s_length--] = 'u';
s[s_length--] = 'n';
}
else{
s[s_length--] = s[n];
}
n--;
}
}
cout << s;
return 0;
}
标签:字符,right,int,反转,随想录,字符串,2k
From: https://blog.csdn.net/weixin_44839832/article/details/139680145