码迷,mamicode.com
首页 > 其他好文 > 详细

每日一题:反转英文句子

时间:2015-03-19 11:35:22      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:字符串   反转   面试题   

反转英文句子的意思是将句子中按顺序排好的单词的顺序颠倒过来,例子如下:
输入: 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;
}

程序运行截图:
技术分享
该程序只考虑英文字母输入,并且不考虑标点符号,所有单词以空格分开。

每日一题:反转英文句子

标签:字符串   反转   面试题   

原文地址:http://blog.csdn.net/liao_jian/article/details/44454065

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!