文档链接:代码随想录
LeetCode344.反转字符串
题目链接:https://leetcode.cn/problems/reverse-string/
思路:这道题很简单,没什么好说的。注意一下什么时候能用库函数,什么时候不能用库函数就好。
直接干:
class Solution {
public:
void reverseString(vector<char>& s) {
char temp;
for(int i = 0; i < s.size() / 2; i++) {
temp = s[i];
s[i] = s[s.size() - 1 - i];
s[s.size() - 1 - i] = temp;
}
}
};
双指针法:
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i = 0, j = s.size() - 1; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
};
LeetCode541.反转字符串Ⅱ
题目链接:https://leetcode.cn/problems/reverse-string-ii/
思路:不要惯性思维每次都i++,其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。因为要找的也就是每2 * 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;
}
};
卡码网54.数字替换
题目链接:https://kamacoder.com/problempage.php?pid=1064
思路:不申请额外内存空间,采用双指针法。
其实很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
这么做有两个好处:
- 不用申请新数组。
- 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
双指针法:
#include<iostream>
using namespace std;
int main() {
string s;
cin >> s;
int count = 0;
int sOldSize = s.size();
for(int i = 0; i < sOldSize; i++) {
if(s[i] >= '0' && s[i] <= '9') {
count++;
}
}
s.resize(sOldSize + count * 5);
int sNewSize = s.size();
for(int i = sNewSize - 1, j = sOldSize - 1; j < i; j--, i--) {
if(s[j] >= '0' && s[j] <= '9') {
s[i--] = 'r';
s[i--] = 'e';
s[i--] = 'b';
s[i--] = 'm';
s[i--] = 'u';
s[i] = 'n';
}else {
s[i] = s[j];
}
}
cout << s << endl;
}
LeetCode.151反转字符串中的单词
题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/
思路:今天有一点思路了,但是力扣上运行不了,我在devC++都可以正常运行。先想办法去除多余的空格,再作一次整体局部反转。
解决了解决了!slow没有初始化!slow = 0就可以了!
双指针法:
class Solution {
public:
void removeExtraSpaces(string &s) {
int slow;
for(int fast = 0; fast < s.size(); fast++) {
if(s[fast] != ' ') {
if(slow != 0) {
s[slow++] = ' ';
}
while(fast < s.size() && s[fast] != ' ') {
s[slow++] = s[fast++];
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
removeExtraSpaces(s);
reverse(s.begin(), s.end());
int start = 0;
for(int i = 0; i < s.size(); i++) {
if(s[i] == ' ') {
reverse(s.begin() + start,s.begin() + i);
start = i + 1;
}
}
reverse(s.begin() + start, s.end());
return s;
}
};
卡码网55.右旋字符串
题目链接:https://kamacoder.com/problempage.php?pid=1065
思路:两次反转得到结果,可以先整体后局部,也可以先局部后整体。
先整体后局部:
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int k;
string s;
cin >> k;
cin >> s;
reverse(s.begin(), s.end());
reverse(s.begin(), s.begin() + k);
reverse(s.begin() + k, s.end());
cout << s << endl;
}
先局部后整体:
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int k;
string s;
cin >> k;
cin >> s;
reverse(s.begin(), s.end() - k);
reverse(s.end() - k, s.end());
reverse(s.begin(), s.end());
cout << s << endl;
}
总结:怎么感觉到现在越来越难了,C++也是没时间去学,写了一整天,今天五个题还没写完,不明白为什么只要跟代码随想录网站上给出来的写的不一样就不通过。