344. 反转字符串(未用库函数)
思路
双指针,前后相向而行,互换
public:
void reverseString(vector<char>& s) {
for(int i=0, j = s.size()-1; i < s.size()/2; i++ ,j--){
swap(s[i], s[j]);
}
}
};
541. 反转字符串 II(i每次跳跃2k步)
收获
每次竟然可移动 2 * k ,i += (2 * k)
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;
}
};
151. 反转字符串中的单词(用时1.5h)
补充知识点
++i与i++的区别
++i是先改变i的值即加1后再使用i的值;而i++是先使用i的值在改变它的值即加。
for循环内部仅形式不同:当i++循环和++i循环在for循环内部,虽然形式上明显不同,但输出结果可以一样。
s和&s的区别
局部变量:s
在外面是s,你传进去后,再怎么改s,外面的s值是不变的;
真实地址变量:&s
传进去之后,怎么改,外面的s也会跟着改
public:
string reverseWords(string s) { //主函数
removeExtraSpaces(s); //调用去空格函数
reverse(s, 0, s.size()-1); //调用:翻转字符串函数
int start = 0; //开始翻转每个单词,只要定位头尾,就能顺利翻转
for(int i = 0; i <= s.size(); ++i){
if(i == s.size() || s[i] == ' ' ){ //一个单词的结束是空格and结尾
reverse(s, start, i - 1);
start = i + 1; //找下一个单词
}
}
return s;
}
void removeExtraSpaces(string& s){ //函数:去除所有空格,并在相邻之间添加空格,用快慢指针
int slow = 0; //思想参考:27移除元素
for(int i = 0; i<s.size(); ++i){
if(s[i] != ' '){
if(slow != 0){ // 手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
s[slow++] = ' ';
}
while(i < s.size() && s[i] != ' '){
s[slow++] = s[i++]; //补上该单词,遇到空格说明单词结束
}
}
}
s.resize(slow); //resize(n) 调整容器的长度大小,使其能容纳n个元素
}
void reverse(string& s, int start, int end){
for(int i =start, j = end; i < s.size()/2; i++, j--){
swap(s[i], s[j]);
}
}
};