#字符串
反转字符串
这道题的思路很简单,我们可以设置双指针,让一个指向第一个字符,另一个指向最后一个字符,然后交换,交换完成后分别向里移动一个单位就好。
class Solution {
public:
void reverseString(vector<char>& s) {
int i = 0;
int j = s.size()-1;
while(i<j){
int temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
};
反转字符串二
这个也没有什么难度,直接模拟就好,只是比上面那道题多了判断的语句。并且为了简化反转的操作,我们可以用reverse函数。
class Solution {
public:
string reverseStr(string s, int k) {
for(int i = 0; i < s.size(); i += (2*k)){
if(s.size() - i < k){
reverse(s.begin() + i, s.end());
}
else{
reverse(s.begin() +i,s.begin()+i+k);
}
}
return s;
}
};
替换空格
这道题给了一个字符串,我们需要将字符串中的所有空格替换成’20%',因为’20%'是三个字符,所以我们需要给字符串s扩展空间,那应该扩展多少呢?
就以两个空格为例,这时候我们需要插入六个字符,但是空格在初始的字符串中已经提供了一个位置,所以真正需要扩展的就是四个字符的容量,只需要让原本字符串的大小加上空格数的两倍就好了。
int cnt = 0;
int left = s.size()-1;
for(int i = 0; i < s.size(); i++){
if(s[i] == ' '){
cnt ++;
}
}
s.resize(s.size()+2*cnt);
那么在重排元素的时候,我们可以从后往前开始插入元素,这样可以避免将已添加的所有元素后移的情况。
可以先看一下上面说的例子,由于在拓展字符串大小之后原字符的位置不变,那么我们就需要手动移位。
从happy开始,我们不妨设置两个指针,一个指向最末尾的y,另一个指向新字符串的最后那个位置,没有遇到空格的时候,正常插入就好,遇到空格的时候,让右边的指针插入’%20’即可。
插入完成之后让右边的指针向左移动两个单位,然后让左右指针同时移动(相当于右指针一共移动了三个单位),由于新字符串大小绝对是符合的,所以我们只管插入。
当然,我们需要一个for循环来帮助我们实现上述过程的重复操作,条件当然是指针不相遇,然后每次循环让左右指针同时向左移动。
for(;left < right; right--,left--){
if(s[left] == ' '){
s[right] = '0';
s[right-1] = '2';
s[right-2] = '%';
right -=2;
}
else{
s[right] = s[left];
}
}
完整代码如下:
class Solution {
public:
string replaceSpace(string s) {
int cnt = 0;
int left = s.size()-1;
for(int i = 0; i < s.size(); i++){
if(s[i] == ' '){
cnt ++;
}
}
s.resize(s.size()+2*cnt);
int right = s.size()-1;
for(;left < right; right--,left--){
if(s[left] == ' '){
s[right] = '0';
s[right-1] = '2';
s[right-2] = '%';
right -=2;
}
else{
s[right] = s[left];
}
}
return s;
}
};