题目一:输入一个英文句子,翻转句子中单词的顺序。但是单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出"student. a am I"。
分析:经典题目。先将整句翻转,再将每个单词翻转就可以了。
实现如下:
void Reverse(char* pBegin,char* pEnd) { if(pBegin==NULL||pEnd==NULL) return; while(pBegin<pEnd) { char temp=*pBegin; *pBegin=*pEnd; *pEnd=temp; pBegin++,pEnd--; } } char* ReverseSentence(char *pData) { if(pData==NULL) return NULL; char *pBegin=pData; char *pEnd=pData; while(*pEnd!=‘\0‘) pEnd++; pEnd--; Reverse(pBegin,pEnd); pBegin=pEnd=pData; while(*pBegin!=‘\0‘) { if(*pBegin==‘ ‘) { pBegin++; pEnd++; } else if(*pEnd==‘ ‘||*pEnd==‘\0‘) { Reverse(pBeign,--pEnd); pBegin=++pEnd; } else { pEnd++; } } return pData; }
题目二:字符串的左旋转操作是把字符串前面的若干个字符功能转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。
分析:类似题目一中的解决方案,将字符串分为两个部分,先旋转这两个部分,以"abcdefg"为例,现将"ab"和"cdefg"分别翻转,得到"ba"和"gfedc",然后整体翻转"bagfedc",得到"cdefgab"。实现如下:
char* LeftRotateString(char* pStr,int n) { if(pStr!=NULL) { int nLength=static_case<int>(strlen(pStr)); if(nLength>0&&n>0&&n<nLength) { char* pFirstStart=pStr; char* pFirstEnd=pStr+n-1; char* pSecondStart=pStr+n; char* pSecondEnd=pStr+nLength-1; Reverse(pFirstStart,pFirstEnd); Reverse(pSecondStart,pSecondEnd); Reverse(pFirstStart,pSecondEnd); } } return pStr; }
本文出自 “仙路千叠惊尘梦” 博客,请务必保留此出处http://secondscript.blog.51cto.com/9370042/1588097
原文地址:http://secondscript.blog.51cto.com/9370042/1588097