完成日期:7月13号
今日总结:
- 获取数组长度记得要减1
- 多多使用STL,比如swap()方法
344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
// 方法:双指针
void reverseString(vector<char>& s) {
char a;
int left=0, right=s.size()-1; // 记得要减1,你次次忘记
while(left<right){
a = s[left];
s[left++] = s[right];
s[right--] = a;
}
}
// 写法二:可以是STL的swap方法
void reverseString(vector<char>& s) {
int left=0, right=s.size()-1;
while(left<right){
swap(s[left++], s[right--]); // 方便很多
}
}
557. 反转字符串中的单词 III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
// 方法一:使用额外的数组空间
string reverseWords(string s) {
string res;
int len = s.length();
int i=0;
while(i<len){
int start = i;
while(s[i]!=' ' && i<len){
i++;
}
for(int j=start; j<i; ++j){
res.push_back(s[i-j+start-1]);
}
if(i++<len) res.push_back(' ');
}
return res;
}
// 方法二:使用头尾双指针(旋转数组常用)
string reverseWords(string s) {
int i=0;
int len = s.size();
while(i<len){
int start = i; // 头指针
while(s[i]!=' ' && i<len){
i++;
}
int end = i-1; // 尾指针
while(start<end){
swap(s[start++], s[end--]);
}
i++;
}
return s;
}