344.反转字符串
简单题
class Solution {
public:
void reverseString(vector<char>& s) {
int r = s.size()-1;
int l = 0;
while(l < r){
char tmp = s[l];
s[l] = s[r];
s[r] = tmp;
l++;
r--;
}
}
};
541. 反转字符串II
也不难,修改一下每次循环的量。直接使用reverse函数即可。
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.size() - 1;
for (int i = 0; i < n; i += (2 * k)){
if (n-i < k) {
reverse(s.begin()+i,s.end());
} else {
reverse(s.begin()+i,s.begin()+i+k);
}
}
return s;
}
};
卡码网:54.替换数字
第一次尝试ACM的写法,刷多leetcode后忘记怎么写了,后续补充学习一下。
这道题的思路不难,但如果不想占用额外空间实现起来比较麻烦一些,需要提前拓宽s的大小,然后再使用双指针填充数据。
此处需要了解resize()函数
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
while(cin>>s){
int count=0;
int oldsize = s.size();
for (int i = 0; i < oldsize; i++){
if (s[i] <= '9' && s[i] >= '0') count++;
}
s.resize(oldsize + 5 * count);
int newsize = s.size();
for (int i = oldsize-1, j = newsize-1; i < j; i--, j-- ){
if (s[i] <= '9' && s[i] >= '0'){
s[j-5] = 'n';
s[j-4] = 'u';
s[j-3] = 'm';
s[j-2] = 'b';
s[j-1] = 'e';
s[j] = 'r';
j -= 5;
} else {
s[j] = s[i];
}
}
cout << s << endl;
}
}
151.翻转字符串里的单词
这个题比较麻烦的地方在于重复空格的删除,但还要保持单词间保留一个空格。
代码如下,有两个需要复习的地方
1. 如何删除重复空格(使用与此前删除重复元素的方法)
2. 举例reverse(1,5)函数所替换的范围为1、2、3、4;不包括5
class Solution {
public:
string reverseWords(string s) {
int n = s.size();
int slow = 0;
for (int i = 0; i < n; ++i) {
if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。
if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
while (i < s.size() && s[i] != ' ') { //补上该单词,遇到空格说明单词结束。
s[slow++] = s[i++];
}
}
}
s.resize(slow); //slow的大小即为去除多余空格后的大小。
reverse(s.begin(),s.end());
int start = 0;
for (int i = 0; i <= s.size(); i++){
if (i == s.size() || s[i] == ' '){
reverse(s.begin()+start,s.begin()+i);
start = i+1;
}
}
return s;
}
};
卡码网:55.右旋转字符串
此题开始自己没想到怎么解决,但看了答案的图以后就清晰多了。先使用整体旋转,之后在分段旋转就可得到结果。
此题还有一个问题,我开始没有添加头文件#include<algorithm>,程序报错了,此处需要记住。
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
string s;
cin >> n;
cin >> s;
int len = s.size();
reverse(s.begin(),s.end());
reverse(s.begin(),s.begin()+n);
reverse(s.begin()+n,s.end());
cout << s << endl;
}