題目如下:
這是一道easy題,大概思路有兩種:
- 雙指針法
兩個指針指向數組的首部和尾部,交換兩個指針指向的字符,然後兩個指針逐漸向中間靠攏,當首指針大於尾指針時結束循環。 - 遞歸
定義一個遞歸函數,每次交換數組首部和尾部的字符,直到遞歸結束。
下面給出具體的實現:
雙指針法
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i=0,j=s.size()-1;i<=j;++i,--j)
{
char temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
};
時間和空間複雜度分析:
遞歸
class Solution {
public:
void reverseString(vector<char>& s) {
swap(s,0,s.size()-1);
}
void swap(vector<char>&s,int start,int end)
{
if(start>end)return;
else {
char temp=s[start];
s[start]=s[end];
s[end]=temp;
swap(s,++start,--end);
}
}
};
時間和空間複雜度分析:
最後其實可以直接利用已經有的算法:reverse()
函數:
class Solution {
public:
void reverseString(vector<char>& s) {
reverse(s.begin(),s.end());
}
};
總結:刷了差不多20道題,感覺雙指針這個方法用的還是比較多的,比如LeetCode26,27,88,167等等題目,需要多多學習。