题目描述
https://leetcode-cn.com/problems/reverse-string/
代码
我的代码:
class Solution {
public:
void reverseString(vector<char>& s) {
int n = s.size();
for (int i = 0; i < s.size()/2; i++) {
char tmp = s[i];
s[i] = s[n-i-1];
s[n-i-1] = tmp;
}
}
};
直接left, right双指针就好,从两头往中间走,同时交换两边的字符即可
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0, right = s.size() - 1;
while (left < right) {
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
};
c++提供了swap函数,直接用更简洁。
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0, right = s.size() - 1;
while (left < right) {
std::swap(s[left++], s[right--]);
}
}
};
follow up:
这个思路挺简单,但是debug了好久,感觉自己代码逻辑还是差。
这道题让我们翻转字符串中的元音字母,元音字母有五个a,e,i,o,u,需要注意的是大写的也算,所以总共有十个字母。我们写一个isVowel的函数来判断当前字符是否为元音字母,如果两边都是元音字母,那么我们交换,如果左边的不是,向右移动一位,如果右边的不是,则向左移动一位
class Solution {
public:
string reverseVowels(string s) {
int left = 0, right = s.size() - 1;
while (left < right) {
if (isVowel(s[left]) && isVowel(s[right])) {
swap(s[left++], s[right--]);
} else if (isVowel(s[left])) {
right--;
} else {
left++;
}
}
return s;
}
bool isVowel(char c) {
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U';
}
};
再follow up
541. 反转字符串 II
这个题想了半天实现思路,终于逼自己一次写出来了。
class Solution {
public:
string reverseStr(string s, int k) {
int len = s.size();
for (int i = 0; i < len; i += 2*k) {
if (i + k < len) {
reverse(s.begin()+i, s.begin()+i+k);
} else {
reverse(s.begin()+i, s.end());
}
}
return s;
}
};
follow up
class Solution {
public:
string reverseWords(string s) {
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;
}
};
py
class Solution(object):
def reverseWords(self, s):
s = s[::-1]
s_list = s.split(' ')
s_r = s_list[::-1]
return ' '.join(s_r)