反转单词顺序

  这曾经是一个面试题,将一行英文句子单词顺序反转,如输入"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));
        }    
}
原文地址:https://www.cnblogs.com/fengfenggirl/p/2934290.html