Leetcode 344
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0;
int right = s.size()-1;
while(left <= right){
swap(s[left], s[right]);
left++;
right--;
}
}
};用两个指针分别指向左右两端,交换他们的值
如果题目中revers是不重要的部分可以直接用reverse函数
Leetcode 541 Reverse String2
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=0; i<s.size(); i+=2*k){
if(i+k <= s.size()){
int left = i;
int right = i+k-1;
while(left<right){
swap(s[left], s[right]);
left++;
right--;
}
}else{
reverse(s.begin()+i,s.end());
}
}
return s;
}
};重点是想到每次i要移动2k,然后在一次循环中反转2k个值
剑指offer05 替换空格
暴力解法
public:
string replaceSpace(string s){
string newString;
for(int i=0; i<s.size(); i++){
char c = s.at(i);
if(c == ' '){
newString.append("%20");
}else{
newString.push_back(c);
}
}
return newString;
}
};一些tips:
push_back只能加一个字符
append可以加多个
string.at();
不需要创建新的string
string replaceSpace(string s){
int count = 0;
int oldsize = s.size();
int newsize = 0;
for(int i=0; i<s.size(); i++){
if(s.at(i) == ' '){
count++;
}
}
newsize = oldsize + 2*count;
s.resize(newsize);
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;
}注意:要从后往前遍历更改string
Leetcode 151 Reverse Words in a String
首先去除空格,然后在再反转整个句子,在反转单个单词
class Solution {
public:
void reverse(string& s, int start, int end){
while(start < end){
swap(s[start], s[end]);
start ++;
end--;
}
}
string reverseWords(string s) {
string newString;
for(int i=0; i<s.size(); i++){
if((i==0 && s[i]==' ') || (i > 0 && s[i] == s[i-1] && s[i] == ' ')){
continue;
}else{
newString.push_back(s[i]);
}
}
while(newString.at(newString.size()-1) == ' '){
newString.resize(newString.size()-1);
}
reverse(newString, 0 , newString.size()-1);
int start = 0;
for(int i = 0; i <= newString.size(); i++){
if(i==newString.size() || newString[i] == ' '){
reverse(newString, start, i-1);
start = i+1;
}
}
return newString;
}
};这里去除空格是用新的string,可以用双指针法,这样就不用在建一个string
Leetcode 189 Rotate Array(与原题相似)
New Array
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int arr[nums.size()];
for(int i =0; i<nums.size(); i++){
arr[i] = nums[i];
}
for(int i=0; i<nums.size(); i++){
nums[(i+k)%nums.size()] = arr[i];
}
}
};不创建新的arr
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
reverse(nums.begin(), nums.end());
reverse(nums.begin(), nums.begin()+k%n);
reverse(nums.begin()+k%n, nums.end());
}
};注意:
reverse(start,end),反转的部分是不包括end这个值的,相当于反转的部分为[start,end)
这道题没有说k<n,所以要写k%n
反转题的小总结:
双指针法(当出现一些条件的时候,可以考虑改变循环的条件)
先反转整体,再反转局部
文章介绍了LeetCode中涉及字符串反转和数组旋转的几道经典问题,包括344号问题的双指针交换、541号问题的间隔反转、05号问题的空格替换以及151号问题的单词反转。解决方案涵盖了不同的策略,如直接使用库函数、双指针法以及分步反转等。
1636

被折叠的 条评论
为什么被折叠?



