【题目】输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“This is a sentence.”,则输出“sentence a is This”。
【解题思路】
1.先将每个单词逆序,得到“sihT si a ecnetnes”
2.再将整个句子逆序,由于每个单词被翻转了两次,因此单词内的字符顺序不变,得到结果“sentence a is This”
如果用java的话,可以直接将字符串分解出来,然后翻转整个句子
【C++代码】
#
include
<iostream
>
using namespace std;
// 对指针p和q之间的所有字符逆序
void ReverseWord( char * p, char * q)
{
while(p < q)
{
char t = *p ;
*p ++ = *q ;
*q -- = t ;
}
}
// 将句子按单词逆序
char * ReverseSentence( char * s)
{
// 这两个指针用来确定一个单词的首尾边界
char * p = s ; // 指向单词的首字符
char * q = s ; // 指向空格或者 '\0'
while( *q != '\0')
{
if( *q == ' ')
{
ReverseWord(p, q - 1) ;
q ++ ; // 指向下一个单词首字符
p = q ;
}
else
q ++;
}
ReverseWord(p, q - 1) ; // 对最后一个单词逆序
ReverseWord(s, q - 1) ; // 对整个句子逆序
return s ;
}
int main()
{
char a[] ={ "This is a sentence"};
cout <<ReverseSentence(a) <<endl;
// cout<<"hello"<<endl;
return 0;
}
using namespace std;
// 对指针p和q之间的所有字符逆序
void ReverseWord( char * p, char * q)
{
while(p < q)
{
char t = *p ;
*p ++ = *q ;
*q -- = t ;
}
}
// 将句子按单词逆序
char * ReverseSentence( char * s)
{
// 这两个指针用来确定一个单词的首尾边界
char * p = s ; // 指向单词的首字符
char * q = s ; // 指向空格或者 '\0'
while( *q != '\0')
{
if( *q == ' ')
{
ReverseWord(p, q - 1) ;
q ++ ; // 指向下一个单词首字符
p = q ;
}
else
q ++;
}
ReverseWord(p, q - 1) ; // 对最后一个单词逆序
ReverseWord(s, q - 1) ; // 对整个句子逆序
return s ;
}
int main()
{
char a[] ={ "This is a sentence"};
cout <<ReverseSentence(a) <<endl;
// cout<<"hello"<<endl;
return 0;
}
【Java代码】
public String reverse (String str)
{
String[] strArray = str.split( " " ); //根据空格把单词提取到数组里面
StringBuffer sb = new StringBuffer();
for ( int i =(strArray. length - 1); i > = 0; i --) //逆序整个数组
{
sb.append(strArray[i]);
sb.append( " " );
}
return sb.toString();
}
{
String[] strArray = str.split( " " ); //根据空格把单词提取到数组里面
StringBuffer sb = new StringBuffer();
for ( int i =(strArray. length - 1); i > = 0; i --) //逆序整个数组
{
sb.append(strArray[i]);
sb.append( " " );
}
return sb.toString();
}
【输出结果】
sentence a is This