一天做了五道题,还好这几道题还算比较简单
344.反转字符串
思路
简单的字符串反转,好像没啥思路可以说的,甚至可以直接用reverse
代码实现
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i = 0 ; i < s.size()/2; i ++)
{
swap(s[i],s[s.size()-i-1]);
}
return ;
}
};
541.反转字符串II
思路
反转k个字符,然后跳过k个字符,反转k个字符,然后跳过k个字符......
代码实现
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;
}
};
收获
reverse反转时是左闭右开区间。
剑指offer 05.替换空格
代码实现
class Solution {
public:
string replaceSpace(string s) {
string res;
for(auto c : s)
{
if(c==' ')
res += "%20";
else
res += c;
}
return res;
}
};
收获
第一次使用使用char类型的这种for循环。
熟悉了string的使用,可以直接加。
151.翻转字符串里的单词
思路
先去除前导空格和尾随空格
for(int i = 0 ; i < s.size(); i ++)
{
if(s[i]!=' ')
{
if(slow!=0)
s[slow++] = ' ';
while(i<s.size()&&s[i]!=' ')
{
s[slow++] = s[i++];
}
}
}
然后进行反转就可以了
代码实现
class Solution {
public:
string reverseWords(string s) {
int slow = 0;
for(int i = 0 ; i < s.size(); i ++)
{
if(s[i]!=' ')
{
if(slow!=0)
s[slow++] = ' ';
while(i<s.size()&&s[i]!=' ')
{
s[slow++] = s[i++];
}
}
}
s.resize(slow);
reverse(s.begin(), s.end());
int start = 0;
for(int i = 0 ; i <= s.size(); i ++)
{
if(i==s.size()||s[i]==' ')
{
reverse(s.begin()+start, s.begin()+i);
start = i+1;
}
}
return s;
}
};
剑指offer58-II.左旋转字符串
思路
反转前k个,反转后面的,然后整天反转,就可以得到结果了!!!
是不是很奇妙!!!
代码实现
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;
}
};