class Solution {
public:
void reverseString(vector<char>& s) {
int length=s.size();
for(int i=0,j=length-1;i<length/2;i++,j--){
char tmp=s[i];
s[i]=s[j];
s[j]=tmp;
//位运算交换
//s[i] ^= s[j];
//s[j] ^= s[i];
//s[i] ^= s[j];
}
}
};
class Solution {
public:
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += (2 * k)) {
// 1. 每隔 2k 个字符的前 k 个字符进行反转
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if (i + k <= s.size()) {
reverse(s.begin() + i, s.begin() + i + k );
} else {
// 3. 剩余字符少于 k 个,则将剩余字符全部反转。
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
法二:reverse自己实现
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]);
}
}
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += (2 * k)) {
if (i + k <= s.size()) {
reverse(s, i, i + k - 1);
continue;
}
reverse(s, i, s.size() - 1);
}
return s;
}
};
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
while(cin>>s){
int count = 0; // 统计数字的个数
int len = s.size();
for (int i = 0; i < len; i++) {
if (s[i] >= '0' && s[i] <= '9') {
count++;
}
}
// 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
s.resize(s.size() + count * 5);
int newlen = s.size();
for(int i = newlen-1, j = len-1; j < i; i--, j--){
if(s[j] < '0' || s[j] > '9')
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;
}
return 0;
}
法二
#include<bits/stdc++.h>
using namespace std;
int main(){
string s,res;
cin>>s;
for(int i=0;i<s.size();i++){
if(isalpha(s[i])){
res+=s[i];
}else if(isdigit(s[i])){
res+="number";
}
}
cout<<res;
return 0;
}
class Solution {
public:
string reverseWords(string s) {
//去除所有空格并在相邻单词之间添加空格, 快慢指针
int slow = 0;
for(int fast = 0; fast < s.size(); fast++){
//遇到非空格就处理,即删除所有空格
if(s[fast] != ' '){
//手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格
if(slow != 0){
s[slow++] = ' ';
}
//补上该单词,遇到空格说明单词结束
while(s[fast] != ' ' && fast < s.size()){
s[slow++] = s[fast++];
}
}
}
s.resize(slow);
for(int i = 0, j = s.size()-1; i < j; i++, j--){
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
int start = 0; //保证第一个单词的开始下标一定是0。
for (int i = 0; i <= s.size(); ++i) {
if (i == s.size() || s[i] == ' ') { //到达空格或者串尾,说明一个单词结束。进行翻转
for(int j = start, k = i-1; j < k; j++, k--){
char tmp = s[j];
s[j] = s[k];
s[k] = tmp;
}
start = i + 1; //更新下一个单词的开始下标start
}
}
return s;
}
};
class Solution {
public:
string reverseWords(string s) {
// 使用双指针
int m = s.size() - 1;
string res;
// 除去尾部空格
while (s[m] == ' ' && m > 0) m--;
int n = m; // n是另一个指针
while (m >= 0) {
while (m >= 0 && s[m] != ' ') m--;
res += s.substr(m + 1, n - m) + " "; // 获取单词并加上空格
while (m >= 0 && s[m] == ' ') m--;
n = m;
}
return res.substr(0, res.size() - 1); // 忽略最后一位的空格
}
};
class Solution {
public:
string reverseWords(string s) {
int i=0,j=0;
string res;
while(s[i]==' '){
i++;
}
int count=-1;
int f=0;
for(int i=0;i<s.size();i++){
if(s[i]!=' '&&f==0){
f=1;
count++;
}else if(f&&s[i]==' '){
f=0;
}
}
while(i<s.size()){
if(s[i]!=' '){
res+=s[i];
f=1;
}else if(f&&count){
res+=' ';
f=0;
count--;
}
i++;
}
reverse(res.begin(),res.end());
for(int i=0;i<res.size();){
int flag = 1;
int j=i+1;
while(flag&&j<res.size()){
if(res[j]==' '){
flag=0;
break;
}
j++;
}
reverse(res.begin()+i,res.begin()+j);
i=j+1;
}
return res;
}
};
法一 先整体反转再局部反转
#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); // 先反转前一段,长度n
reverse(s.begin() + n, s.end()); // 再反转后一段
//先局部反转 再整体反转
//reverse(s.begin(), s.begin() + len - n); // 先反转前一段,长度len-n ,注意这里是和版本一的区别
//reverse(s.begin() + len - n, s.end()); // 再反转后一段
//reverse(s.begin(), s.end()); // 整体反转
cout << s << endl;
return 0;
}
法二 拼接字符串
#include <iostream>
using namespace std;
int main()
{
int n;
string s;
cin >> n >> s;
int len = s.size();
cout << (s + s).substr(len - n, len) << '\n';
return 0;
}
法三 没ac
#include<iostream>
#include<string.h>
using namespace std;
int main(){
string s;
int k;
cin >> s;
cin >> k;
int len = s.size();
string tmp = s.substr(len-k,k);
for(int i = len-k-1; i >= 0; i--){
s[i+k] = s[i];
}
for(int i = 0; i < k; i++){
s[i] = tmp[i];
}
cout << s << endl;
return 0;
}