反转单词顺序

  这曾经是一个面试题,将一行英文句子单词顺序反转,如输入"feng i love you!",输出为"you! love i feng",标点符号当做普通字符处理,这个题目可以在九度上在线提交http://ac.jobdu.com/problem.php?cid=1039&pid=25

  这里提供一个简单的思路,先将整个英文句子对称反转,"abc de"反转成"ed cba",再将其中的每个单词对称反转一次得到"de abc",时间复杂度o(n),空间复杂度o(1)。下面证明一下为什么这样两次反转后能实现单词顺序的反转,假设该句子为s1="AB...CD"(其中A、B、C、D代表单词),经过一次整体对称反转后,句子变为s2="D'C'...B'A'"(其中的A'、B'、C'、D'分别代表ABCD的反转。再对每个单词反转得到s3="DC...BA",实现反转的目的。

  上代码,在九度上AC.

#include<stdio.h>

#include<string.h>

#define MAXLENGHT 50000

void printString(char *ch);

/*

*    对称交换字符串ch的low到high之间的字符

*/

char* reverse(char *ch,int low,int high){

    for(int i=low;i<low+(high-low)/2;i++){

        char temp = *(ch+i);

        *(ch+i)=*(ch+low+high-1-i);

        *(ch+low+high-1-i)=temp;

            printString(ch);

            printf("\n");

    }

    return ch;

}



int main(){

    char chArray[MAXLENGHT];

    char* ch = chArray;

    while(gets(ch)!=NULL){

        int length = strlen(ch);

        ch = reverse(ch,0,length);//整体进行对称交换

        int low = 0;

        int high = 0;

        while(high <= length - 1){//对每一个单词进行交换

            while(*(ch+high) != ' ' && high <= length - 1){

                high++;

            }

            ch = reverse(ch,low,high);            

            high++;

            low = high;        

        }

        printString(ch);

    }

    return 0;

}

void printString(char *ch){//打印字符串

    int length = strlen(ch);

    for(int i=0;i<length;i++){

            printf("%c",*(ch+i));

        }    

}

 

你可能感兴趣的:(顺序)