饭不食,水不饮,题必须刷
C语言免费动漫教程,和我一起打卡! 《光天化日学C语言》
LeetCode 太难?先看简单题! 《C语言入门100例》
数据结构难?不存在的! 《数据结构入门》
LeetCode 太简单?算法学起来! 《夜深人静写算法》
给定一个字符串,需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
样例输入:“abc defg hi”
样例输出:“cba gfed ih”。
string
,返回值也是string
;string
是 c++ 的 STL 中的模板类,支持动态扩容,有关于string
动态扩容的可以参考一下这篇文章:《C/C++ 面试 100 例》(五)string 扩容策略。class Solution {
public:
string reverseWords(string s) {
}
};
LeetCode 557. 反转字符串中的单词 III
记录一个 p r e pre pre 变量,初始化为 0,然后开始枚举整个字符串,只要遇到空格或者字符串结尾,令当前枚举的位置为 i i i,我们就将 [ p r e , i − 1 ] [pre, i-1] [pre,i−1] 的字符逆序放入结果字符串中,并且再加上一个空格(如果是遇到字符串结尾,则不加入空格)。枚举完毕,将结果字符串返回即可。
class Solution {
public:
string reverseWords(string s) {
string ans = ""; // (1)
int pre = 0; // (2)
for(int i = 0; i <= s.length(); ++i) { // (3)
if(i == s.length() || s[i] == ' ') { // (4)
for(int j = i-1; j >= pre; --j) {
ans.push_back(s[j]); // (5)
}
if(i < s.length()) // (6)
ans.push_back(' ');
pre = i + 1; // (7)
}
}
return ans;
}
};
ans
为空字符串;pre
变量为 0,代表从字符串下标 0 开始;s.length()
,以空格分隔的字符串最后部分会漏掉;push_back
接口;两个 for 循环嵌套枚举时,算法时间复杂度不一定是 O ( n 2 ) O(n^2) O(n2),即不一定是乘法关系,也有可能是 O ( n ) O(n) O(n),即加法关系。