- 一个是 例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。
这道题的解法就是, 先翻转整个字符串,然后依次翻转每个单词
注意在 依次翻转每个单词的时候,判断条件的先后顺序:
(1)循环终止的条件是 a>=len
(2) 先判断 a 时候为 ‘ ’,如果是,则++
(3) 接着就是 翻转的条件, b == ’ ’ || b == len; 翻转完要更新 a , b
(4) 然后是一般情况, 则 只 ++b;
class Solution {
public:
string ReverseSentence(string str) {
//if (str==nullptr)return NULL;
int n = str.size();
if (n==0 || n==1)return str;
reverse(0,n-1,str);
int a = 0,b = 0;
while(a<n)
{
//if (a==n && b==n)break;
if (str[a]==' ')
{
a++;
b++;
}
else if (str[b]==' ' || b==n)
{
reverse(a,--b,str);
b++;
a = b;
}
else
{
//a++;
b++;
}
}
return str;
}
void reverse(int s,int e,string &str)
{
while(s<e)
{
swap(str[s],str[e]);
s++;
e--;
}
}
};
- 循环左移
abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。
这道题 是将字符串分为两个部分,!!!!唉,翻转三部分,前n个,后面的,然后是整体
class Solution {
public:
string LeftRotateString(string str, int n) {
if (n==0 || str.size()==0 || str.size()==1)return str;
reverse(str,0,n-1);
reverse(str,n,str.size()-1);
reverse(str,0,str.size()-1);
return str;
}
void reverse(string& str,int a,int b)
{
while(a<b)
{
swap(str[a],str[b]);
a++;b--;
}
}
};