1、编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例:
输入:s = ["h","e","l","l","o"] 输出:["o","l","l","e","h"]
这个大概也是用双指针的方法,so easy。
代码:
class Solution {
public:
void reverseString(vector<char>& s) {
int i = 0;
int j = s.size()-1;
while(i<j){ //之前用的<=,其实应该不用=,简便一下就删掉了
swap(s[i],s[j]); //左右指针所指的字符交换位置
i++;
j--;
}
}
};
时间复杂度O(n);空间复杂度O(1)。
2、给定一个字符串
s
,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例:
输入:s = "Let's take LeetCode contest" 输出:"s'teL ekat edoCteeL tsetnoc"
先开始的时候没注意看题,结果做成了把所有内容反置(也就是栈的形式),虽然做错了,但还是写一下吧。
错误代码:
class Solution {
public:
string reverseWords(string s) {
string ans;
int i =s.size();
while(i>=0){ //全部反置
if (s[i] == ' '){
ans.push_back (' ');
}else{
ans.push_back (s[i]);
}
i--;
}
return ans;
}
};
正确代码:
class Solution {
public:
string reverseWords(string s) {
int length = s.length();
int i = 0;
int start = 0;
while (i < length) {
int start = i;
while (i < length && s[i] != ' ') {
i++;
}
int left = start, right = i - 1; //这里使得left和right在单词两边
while (left < right) { //单词内部交换
swap(s[left], s[right]);
left++;
right--;
}
while (i < length && s[i] == ' ') { //如果i检测出空格则相对于没检测到空格多加1,也使得下一轮的left不等于right;
i++;
}
}
return s;
}
};
但是这个题仅限于字符串可变语言,如:C/C++, Ruby, PHP, Swift;对于字符串不可变语言:Java, Python, C#, Javascript, Go的话,这个方法就不好使了。
还有就是有些题解把start=i放在while(i<length)的后面,我觉得不大合理,这样容易导致start和i没办法保证在一个单词的左右边吧?但是输出结果没问题,我觉得有点迷。
这里最后还是时间复杂度为O(n),空间复杂度O(1)。同时也可以创建另一个字符串用栈的方式达成目的,但是相对来说空间复杂度会更大,为O(n),所以这里便不再阐述了。