例1
题号:剑指offer 05, 难度:简单
题目描述:
解题思路:
找替换前后字符串长度的变化。空格1个字符,%20三个字符,每替换一个空格长度就加2。利用下标访问字符串的对应字符,先把重新设置字符串s的长度,然后从后往前用双指针挨个替换,一个是最初s的长度newSize,另一个是替换完空格后s的长度oldSize。如果s[newSize]这个位置是空格,s[oldSize]和它前面两个位置,就赋值%20,oldSize要往前移动两格。如果不是空格就正常赋值。
具体代码:
class Solution {
public:
string replaceSpace(string s) {
int count = 0;
int oldSize = s.size();
for(int i = 0; i < s.size(); i++)
{
if(s[i] == ' '){
count++;
}
}
//空格占一个,%20占三个,替换一个空格总长度+2
s.resize(s.size() + count * 2);
int NewSize = s.size();
for(int i = NewSize - 1, j = oldSize - 1; i > j; i--, j--)
{
if(s[j] == ' ')
{
s[i] = '0';
s[i - 1] = '2';
s[i - 2] = '%';
i -= 2;
}
else
{
s[i] = s[j];
}
}
return s;
}
};
例2
题号:剑指offer 58, 难度:简单
题目描述:
解题思路:
根据上一题总结的思路,先看操作前后有什么区别。
abcdefg 变为 cdefgab ,要把cdefg所有前移两格,然后ab插入到队尾。
分两步走:我可以先把ab拿出来存到个字符串里,然后把cdefg前移。最后把ab拼在尾部。
具体代码:
class Solution {
public:
string reverseLeftWords(string s, int n) {
string s1;
s1.resize(n);
//拆出来
for(int i = 0; i < n; i++)
{
s1[i] = s[i];
}
int Ssize = s.size();
for(int i = 0, j = n; i < Ssize; i++)
{
if(j < Ssize)
{
s[i] = s[j];
j++;
}
}
for(int i = 0; i < n; i++)
{
s.pop_back();
}
int size = s.size();
s = s + s1;
return s ;
}
};
总结
两点:
第一点容易下标越界,得注意for循环到最后i和j的值超没超过长度;
第二点如果照着我自己的思路,字符串往前移动n位后,还应该pop出来n位,然后再拼接。
剑指offer上,这题和翻转单词顺序用相同的思路,把要旋转的字符串和余下的字符串看做两个单词,把整个字符串翻转后,再把这两个单词翻转。单词的界限我不太会判定,明天早上再看看。