day8 第四章 字符串part01
1.反转字符串
题目:https://leetcode.cn/problems/reverse-string/
题解
class Solution {
public:
void reverseString(vector<char>& s) {
int i=0;
int j=s.size()-1;
for(i=0;i<s.size()/2;i++){
swap(s[i],s[j]);//先交换,再移动
j--;
}
}
};
盲点:
1.库函数用作解题辅助
解决题目的核心不可以直接用函数,例如题目让排序不能直接用sort();
2.反转字符串II
题目https://leetcode.cn/problems/reverse-string-ii/
题解
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=2*k){//每计数到2k个字符就xx;以2k个移动
if(i+k<=s.size()){//下标本应<s.size,但reverse函数左闭右开不会取到i+k;所以i+k可取到s.size()
reverse(s.begin()+i,s.begin()+i+k);//reverse函数:下标范围第i个到第i+k-1,内字符串全部反转
}
else{//i还没遍历完s字符串,且剩余字符少于k个
reverse(s.begin()+i,s.end());//有多少反转多少
}
}
return s;
}
};
盲点:
1.reverse函数用法
reverse(str.begin(), str.end());//完全翻转字符串
//str.begin ()是str字符串的第一个元素,str.end()是str字符串的最后一个元素
输入:1 2 3 4 5
输出:5 4 3 2 1
3.替换
题目:https://leetcode.cn/problems/ti-huan-kong-ge-lcof/
题解
class Solution {
public:
string pathEncryption(string path) {
for(int i=0;i<path.size();i++){
if(path[i]=='.'){
path[i]=' ';
}
}
return path;
}
};
盲点:
1.字符串和数组区别
4…翻转字符串里的单词
题目https://leetcode.cn/problems/reverse-words-in-a-string/
题解:
class Solution {
public:
void removeZero(string&s){//删除多余空格
int slow=0;
for(int i=0;i<s.size();++i){//?
if(s[i]!=' '){//遇到一个非空格
if(slow!=0){//如果不是指向开头(第一个单词前不需加空格)
s[slow++]=' ';//先在(单词)前加个空格(与相邻前一个单词区分开的空格)
}
while(s[i]!=' '&&i<s.size()){//判断接下来还有无,再遇到空格说明遍历完一个///单词
s[slow++]=s[i++];
}
}
}
s.resize(slow);//更新字符串长度的方法
}
void reverseString(string&s,int start,int end){//定义左闭右闭;反转从start到end的字符串
for(int i=start,j=end;i<j;i++,j--){
swap(s[i],s[j]);
}
}
string reverseWords(string s) {
removeZero(s);
reverseString(s,0,s.size()-1);//反转整个字符串
int start=0;//从s[0]开始遍历
for(int i=0;i<=s.size();i++){//i要指向最后一个字母后面(s.size),i-1才指向最后一个单词的末尾
if(s[i]==' '||i==s.size()){//遍历到空格或是下标到了末尾,说明前面是一个单词
reverseString(s,start,i-1);//反转这个单词
start=i+1;//到下个单词的开头
}
}
return s;
}
};
盲点:
1.为什么循环条件是**++i**
2.resize函数用法
s.resize(slow);//更新字符串s长度为slow
3.为什么循环条件i<=s.size()
i=s.size()-1时指向最后一个字母,但i要指向最后一个字母后面;i-1才指向最后一个单词的末尾
4.reverse函数用法
本来reverse函数默认翻转的时候是左闭右开的区间;
该题定义了函数是左闭右闭
5.左旋转字符串
题目https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
题解:
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(), s.begin() + n);
reverse(s.begin() + n, s.end());
reverse(s.begin(), s.end());
return s;
}
};
还可以先整个反转再局部反转
class Solution {
public:
string dynamicPassword(string password, int target) {
reverse(password.begin(),password.end());
reverse(password.begin(),password.begin()+password.size()-target);
reverse(password.begin()+password.size()-target,password.end());
return password;
}
};
盲点:
4.reverse函数用法
1.reverse函数默认翻转的时候是左闭右开的区间;