代码随想录算法训练营day8(day12补) | 344.反转字符串 541.反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串
刷题笔记day8
344.反转字符串
文章讲解:代码随想录
是否自己做出来通过全部用例:是
遇到的困难/犯的错误
这题很简单,双指针法。
自己写的代码
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0;
int right = s.size() - 1;
while (right > left) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
--right;
++left;
}
}
};
看了题解后的收获
数组存储在连续空间,反转比链表简单。
541.反转字符串II
文章讲解:代码随想录
是否自己做出来通过全部用例:否
遇到的困难/犯的错误
审题不清,题目要求是每2k个字符,反转其中的前k个字符。
自己写的代码
class Solution {
public:
string reverseStr(string s, int k) {
int left, right;
string s1 = s;
for (int i = 0; i <= s1.length() / (2 * k); ++i) {
if (s1.length() - 2 * k * i < k) {
left = 2 * k * i;
right = s1.length() - 1;
}
else {
left = 2 * k * i;
right = 2 * k * i + k - 1;
}
while (right > left) {
char temp = s1[left];
s1[left] = s1[right];
s1[right] = temp;
--right;
++left;
}
}
return s1;
}
};
看了题解后的收获
i可以递增2k,特殊情况:if (i + k < s1.length())
。
题剑指Offer 05.替换空格
文章讲解:代码随想录
是否自己做出来通过全部用例:否
遇到的困难/犯的错误
知道用双指针法,但是for循环没捋清楚逻辑。
自己写的代码
看了题解后写的代码:
class Solution {
public:
string replaceSpace(string s) {
int counts = 0;
auto oldsize = s.size();
for (auto c : s) {
if (c == ' ') {
++counts;
}
}
s.resize(s.size() + counts * 2);
auto newsize = s.size();
for (int i = newsize - 1, j = oldsize - 1; i > j; --i, --j) {
if (s[j] != ' ') {
s[i] = s[j];
}
else {
s[i] = '0';
s[i-1] = '2';
s[i-2] = '%';
i -= 2;
}
}
return s;
}
};
看了题解后的收获
注意双指针法中的逻辑,for循环捋不清也可以把两个指针先在外面定义好,再while (front < behind)
。
代码如下:
class Solution {
public:
string replaceSpace(string s) {
int counts = 0;
auto oldsize = s.size();
for (auto c : s) {
if (c == ' ') {
++counts;
}
}
s.resize(s.size() + counts * 2);
auto newsize = s.size();
int front = oldsize - 1;
int behind = newsize - 1;
while (front < behind) {
if (s[front] != ' ') {
s[behind] = s[front];
}
else {
s[behind] = '0';
s[behind-1] = '2';
s[behind-2] = '%';
behind -= 2;
}
--front;
--behind;
}
return s;
}
};
151.翻转字符串里的单词
文章讲解:代码随想录
是否自己做出来通过全部用例:是
遇到的困难/犯的错误
思路是把每个单词是放在一个vector
自己写的代码
class Solution {
public:
string reverseWords(string s) {
vector<string> vec;
string temp;
char last = ' ';
for (int i = 0; i < s.size(); ++i) {
if (s[i] != ' ') {
temp += s[i];
if (i == s.size() - 1) {
vec.push_back(temp);
}
}
else {
if (last != ' ') {
vec.push_back(temp);
temp.clear();
}
}
last = s[i];
}
temp.clear();
reverse(vec.begin(), vec.end());
for (auto iter = vec.begin(); iter != vec.end(); ++iter) {
temp += *iter;
if (iter == vec.end() - 1) {
continue;
}
temp += " ";
}
return temp;
}
};
看了题解后的收获
快慢指针法对多余的空格进行处理后,进行整体的reverse和单词的reverse。
剑指Offer58-II.左旋转字符串
文章讲解:代码随想录
是否自己做出来通过全部用例:是
遇到的困难/犯的错误
额外创造了一个字符串,用resize实现。
自己写的代码
class Solution {
public:
string reverseLeftWords(string s, int n) {
auto oldsize = s.size();
s.resize(s.size()+n);
for (int i = 0; i<n;++i) {
s[oldsize+i]=s[i];
}
string result(s, n);
return result;
}
};
看了题解后的收获
可以不额外创造空间,用两次reverse实现。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 jhhuangのblog!