No43:简单的字符串处理。
string LeftRotateString(string str, int n) {
// write code here
if(str.size() == 0) return {};
n = n % str.size();
if(n == 0) return str;
string res;
for(int i = n; i < str.size(); i++){
res = res + str[i];
}
for(int i = 0; i < n; i++){
res = res + str[i];
}
return res;
}
No44:翻转单词序列
字符串处理
c++中的string对象,没有内置的split函数,需要自己手写。
可以用istringstream配合getline实现。
题外话 ,关于左右值引用的介绍:一文读懂C++右值引用和std::move – 知乎
vector<string> split(string strs, char s){
istringstream iss(strs);
string token;
vector<string> res;
while(getline(iss, token, s)){
res.emplace_back(token);
}
return res;
}
string ReverseSentence(string str) {
if(str.size() == 0) return {};
string res;
vector<string> tmp;
tmp = split(str, ' ');
for(int i = tmp.size() -1; i >=0; i--){
res = res + tmp[i] + " ";
}
res.pop_back();
return res;
}
另一种O1空间复杂度的算法,整体反转再局部反转。
string ReverseSentence(string str) {
if(str.size() == 0) return {};
reverse(str.begin(), str.end());
int start = 0;
str += " "; //加一个" " 方便后续处理
// .find: 找从pos开始(包括pos处字符)匹配str的位置下标 end = str.find(' ') 找到当前开始第一个' '下标
for(int end = str.find(' '); end != string::npos; end = str.find(' ', start)){
// 反转范围为[)
reverse(str.begin() + start, str.begin() + end);
start = end + 1;
}
str.pop_back(); // 最后要把添加上的空格删掉
return str;
}