知识点:
一般库函数都是左闭右开。
库函数:
reverse ( first , last ) ;
first
: 要反转的范围的起始迭代器(包括该位置)
last
: 要反转的范围的结束迭代器(不包括该位置)
swap(a,b);交换两值
344.反转字符串
一般库函数都是左闭右开。
库函数:
reverse ( first , last ) ;
first
: 要反转的范围的起始迭代器(包括该位置)
last
: 要反转的范围的结束迭代器(不包括该位置)
swap(a,b);交换两值
交换两值的两个方法:
临时变量
int tmp = s[i];
s[i] = s[j];
s[j] = tmp;
异或运算
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];
异或规则:
如果两个位相同,结果为 0。
如果两个位不同,结果为 1。
解释:
假设 s[i]
的值为 a
,s[j]
的值为 b
第一步:s[i] ^= s[j];
s[i] = a ^ b; // s[i] 现在是 a 和 b 的异或结果
第二步:s[j] ^= s[i];
s[j] = b ^ (a ^ b); // b ^ (a ^ b) = a ^ b ^ b = a ^ ( b ^ b ) = a ^ 0 = a
第三步:s[i] ^= s[j];
s[i] = (a ^ b) ^ a; // 同理,s [ i ] = b
代码
class Solution {
public:
void reverseString(vector<char>& s) {
int left=0,right=s.size()-1;
while(left<s.size()/2)
{
swap(s[left],s[right]);
right--;
left++;
}
}
};
541. 反转字符串II
字符串操作进阶! | LeetCode:541. 反转字符串II
代码
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=(2*k))
{
if(i+k<=s.size())
{
reverse(s.begin()+i,s.begin()+i+k);
}
else
reverse(s.begin()+i,s.end());
}
return s;
}
};
替换数字
做题思路
1 . 输入字符串
2 . 统计数字字符的个数
3 . 调整字符串大小
4 . 从后向前替换字符
双指针
#include <iostream>
using namespace std;
int main()
{
string s;
cin>>s;
int p=s.size()-1;
int count=0;
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9')
count++;
}
s.resize(s.size()+count*5);
int j=s.size()-1;
while(p>=0)
{
if(s[p]>='0'&&s[p]<='9')
{
s[j--]='r';
s[j--]='e';
s[j--]='b';
s[j--]='m';
s[j--]='u';
s[j--]='n';
}
else
s[j--]=s[p];
p--;
}
cout<<s;
return 0;
}