每日一题2:反转英文句子

来源:互联网 发布:windows 2003server 编辑:程序博客网 时间:2024/05/21 18:46

反转英文句子的意思是将句子中按顺序排好的单词的顺序颠倒过来,例子如下:
输入: wo shi zhong guo ren
输出: ren guo zhong shi wo
直观的解法是先将每个单词提取出来,然后计算每个单词反转后所的位置,最后将单词填到相应的位置上。这种方案不仅占用辅助空间,并且计算复杂。另一种方案是将整个句子看做一个字符串,先反转字符串字母的顺序(包含空格),然后再一次反转每个单词的字母顺序。反转单词字母的意思是:
输入:wo shi zhong guo ren
输出:ner oug gnohz ihs ow
下面看第二种思路的代码:

#include "stdafx.h"#include <string.h>#include <iostream>#include <vector>using namespace std;void ReverseString(char str[],int start,int end){    for (int i = start,j = end; i < j; ++i,--j)    {        char c = str[i];        str[i] = str[j];        str[j] = c;    }}void ReverseString(char str[]){    int length = strlen(str);    ReverseString(str,0,length - 1);}void ReverseSentence(char str[]){    ReverseString(str);    vector<int> splitIndex;    int length = strlen(str);    //记录下单词分隔符的位置(空格),句首放置一个虚拟空格    splitIndex.push_back(-1);    for (int i = 0; i < length; ++i)    {        if(str[i] == ' ')            splitIndex.push_back(i);    }    //句尾放置一个虚拟空格    splitIndex.push_back(length);    int count = splitIndex.size() - 1;    for (int i = 0; i < count; ++i)    {        ReverseString(str,splitIndex[i] + 1,splitIndex[i+1] - 1);    }}int _tmain(int argc, _TCHAR* argv[]){    char str[] = "wo shi zhong guo ren";    cout<<str<<endl;    ReverseSentence(str);    cout<<str<<endl;    return 0;}

程序运行截图:
这里写图片描述
该程序只考虑英文字母输入,并且不考虑标点符号,所有单词以空格分开。

1 0
原创粉丝点击