344.反转字符串
要求不使用额外空间实现反转字符串,所以用双指针法,从头尾向中间移动,交换所在结点
class Solution {
public:
void swap(char&a, char&b) {
char c;
c = a;
a = b;
b = c;
}
void reverseString(vector<char>& s) {
int left = 0;
int right = s.size() - 1;
while (left<right)
{
swap(s[left], s[right]);
left++;
right--;
}
return;
}
};
541.反转字符串II
要求每2k个字符反转前k个,需要看字符串长度
len
与k和2k的关系,小于k的全部反转,大于k的只反转前k个字符
class Solution {
public:
string reverseStr(string s, int k) {
int len = s.length();
int flag = 0;//标识减了多少次2k
int n = 2 * k;
for(int i=len;i>0;i-=n){
//每次减2k,i是剩余长度
if (i >= 2 * k) {
int left = 0+flag*n;
int right = left + k- 1;
while (right > left)
{
swap(s[left],s[right]);
right--;
left++;
}
}
//[k,2k)
else if (i >= k && i < 2 * k) {
int left = 0 + flag * n;
int right = left + k - 1;
while (right > left)
{
swap(s[right], s[left]);
right--;
left++;
}
}
//(0,k)
else {
int left = 0 + flag * n;
int right = len-1;
while (right > left)
{
swap(s[right], s[left]);
right--;
left++;
}
}
flag++;
}
return s;
}
};
54.替换数字
要将每次遇到的数字都替换为
number
,而且不使用额外空间,也就是每遇到一个数字就将数组扩大5个单位长度(因为原来的数字位也能放一个字母)来存放number
,从后向前添加number
#include <iostream>
#include "cstdio"
using namespace std;
int main() {
string s;
while (cin>>s) {
int sOldIndex = s.size() - 1;
//指向原字符串最后一个字符
int count = 0; // 统计数字的个数
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 sNewIndex = s.size() - 1;//指向新字符串的最后一个位置
while (sOldIndex >= 0) {// 从后往前将数字替换为"number"
if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {
s[sNewIndex--] = 'r';
s[sNewIndex--] = 'e';
s[sNewIndex--] = 'b';
s[sNewIndex--] = 'm';
s[sNewIndex--] = 'u';
s[sNewIndex--] = 'n';
} else {
s[sNewIndex--] = s[sOldIndex];
}
sOldIndex--;
}
printf("%s\n", s.c_str());
}
}
151.翻转字符串里的单词
由于字符串中的空格数量不确定,需要先去掉空格,具体逻辑类似数组章节中的27.移除元素,用双指针法移除,得到移除不符合要求空格后的字符串,再将其整体反转再每个单词反转就得到了最终结果
class Solution {
public:
void reverse(string& s, int start, int end) {
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
void removeSpace(string&s){
int fast=0;
int slow=0;
while (fast<s.size()) {
if(s[fast]!=' '){
if(slow!=0)//不是第一个词手动在单词前添加空格
s[slow++]=' ';
while (fast<s.size()&&s[fast]!=' '){
s[slow]=s[fast];
slow++;
fast++;
}
}
fast++;
}
s.resize(slow);
}
string reverseWords(string s) {
removeSpace(s);
reverse(s,0,s.size()-1);
int begin=0;
int end=0;
for (int i = 0; i <= s.size(); ++i) {
if(i==s.size()||s[i]==' '){
reverse(s,begin,i-1);
begin=i+1;
}
}
return s;
}
};
55.右旋转字符串
把字符串看成两部分,长度分别为
len-k
和k
,先整体反转,再分别反转,就得到所求了
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int main() {
int k;
cin >> k;
string s;
cin >> s;
int len = s.size();
reverse(s.begin(), s.end());
reverse(s.begin(), s.begin() + k);
reverse(s.begin()+k, s.end());
cout << s << endl;
return 0;
}