反转单词顺序
这曾经是一个面试题,将一行英文句子单词顺序反转,如输入"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)); } }