题目:
Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue
",
return "blue is sky the
".
Clarification:
答案:
- What constitutes a word?
A sequence of non-space characters constitutes a word. - Could the input string contain leading or trailing spaces?
Yes. However, your reversed string should not contain leading or trailing spaces. - How about multiple spaces between two words?
Reduce them to a single space in the reversed string.
void reverseWords(string &s)
{
string s0 ;
unsigned int x1 = s.length();
unsigned int* x = new unsigned int[x1 + 1]; //用来存储空格的位置
unsigned int* xx = new unsigned int[x1 + 1]; //用来存储字母的相对位置
unsigned int j = 0;
for (unsigned int i = 0; i < x1 + 1; i++) //初始化数组
{
xx[i] = -1;
x[i] = -1;
}
unsigned int m = 0;
//去除多余空格
for (unsigned int i = 0; i < x1; i++)
{
if (s[i] != ' ')
s0 += s[i] ;
else if (i > 0 && s[i] == ' ' && s[i-1] == ' ')
{
continue;
}
else if (i == 0)
{
continue;
}
else
{
s0 += ' ';
}
}
s0 = s0.substr(0, s0.find_last_not_of(' ')+1);
//计算空格的位置
unsigned int length0 = s0.length();
for (unsigned int i = 0; i < length0 ; i++)
{
if (s0[i] == ' ')
{
x[m] = i;
m++;
}
else if (i == length0 - 1)
x[m] = i+1;
}
//计算字母的相对位置
m = 0;
int n = 0;
for (unsigned int i = 0; i < length0 ; i++)
{
if (i < x[m])
{
xx[i] = length0 - (x[m]- n);
n++;
}
else
{
xx[i] = UINT_MAX;
n = 0;
m++;
}
}
//进行调节
m = 0;
s = s0;
for (unsigned int i = 0; i < length0 ; i++)
{
if (xx[i] != UINT_MAX)
s[xx[i]] = s0[i];
else if (x[m] != length0)
{
s[length0 - x[m] - 1] = ' ';
m++;
}
}
delete[] x;
delete[] xx;
return;
}
解析:
首先要了解最普通的串是什么情况 : “ blue is sky the ”。像这种情况一般要进行4步
1》去除多余空格。输出为 "the sky is blue
"
2》计算空格的位置。
3》计算每个单词中每个字母在进行调节之后的相对位置。
4》进行位置调节。
加上用到的一个substr()函数,总体复杂度为5n,即:O(n)。