面试题4:单词翻转
2016-03-21 20:43 Keiven_LY 阅读(389) 评论(0) 编辑 收藏 举报题目描述
编写一个函数将字符串“I am from Beijing”,翻转成“Beijing from am I”,即将字符串中各个单词的位置倒置,但不改变各个单词本身。
方法一:先翻转单词,再整体翻转
char *ReverseWorldInString_1(char *str) { char *start = str; char *end = str; char *ptr = str; while(*ptr++!='\0') //遍历整个字符串,将单词翻转 { if(*ptr==' '||*ptr=='\0') //以空字符或结束符作为单词的标记,这里*ptr==' '的空格符中间要有空格,不能连着,即''这样,因为这样不识别 { end=ptr-1;//指向单词的最后一个字符 while(start<end) swap(*start++,*end--); //将单词倒置 start=end=ptr+1; //指向下一个单词 } } start=str; //start指向整个字符串的开头 end=ptr-2; //end指向整个字符串的末尾 while(start<end) swap(*start++,*end--); //遍历字符串整个进行翻转 return str; }
方法二:先整体翻转,再翻转单词
char *ReverseWorldInString_2(char *str) { char *start=str; char *end=str; char *ptr=str; char *p=str; while(*ptr++!='\0') //遍历整个字符串,将单词翻转 end=ptr-1; //找到字符串的末尾 while(start<end) swap(*start++,*end--); //倒置整个字符串 start=str; //start指向整个字符串的开头 end=ptr-1; //end指向整个字符串的末尾 while(*p++!='\0') //遍历整个字符串,将单词翻转 { if(*p==' '||*p=='\0') //以空字符或结束符作为单词的标记,这里*ptr==' '的空格符中间要有空格,不能连着,即''这样,因为这样不识别 { end=p-1; //指向单词的最后一个字符 while(start<end) swap(*start++,*end--); //将单词倒置 start=end=p+1; //指向下一个单词 } } return str; }
测试程序:
int main() { char strSrc_1[]="I am from Beijing"; cout<<"原字符串是:"<<strSrc_1<<endl; ReverseWorldInString_1(strSrc_1); cout<<"反转后字符串为:"<<strSrc_1<<endl; char strSrc_2[]="Shang Hai is a big city"; cout<<"原字符串是:"<<strSrc_2<<endl; ReverseWorldInString_2(strSrc_2); cout<<"反转后字符串为:"<<strSrc_2<<endl; system("pause"); return 0; }
注意:
程序中while(*ptr++!='\0') //遍历整个字符串,将单词翻转
end=ptr-2; //找到字符串的末尾
为什么end=ptr-2?原因是,字符串在内存中的存储如下:
指针ptr开始指向字符串的首地址,即图示1所指位置,while循环后,ptr逐加,当*ptr='\n'时,实际ptr是处于图示6所指位置,后还要++,及while结束后,ptr指向图示7所指位置,而要使指针指向字符串的末尾,即图示5所指位置,就要让end=ptr-2。