题目来自剑指Offer
题目(1)
思路:
假设句子中的三个单词为XYZ,则我们要求的是ZYX。
给出字符串的转置性质:
可以推出:
此时可以推出思路一:
可以先对句子中的所有单词进行转置,之后再进行(句子)整体转置。
思路二:先进行句子转置,后对每一个单词转置,也是可以的。
代码:根据思路一写的:先对单词进行转置,之后对句子进行转置。
#include <iostream> #include <assert.h> using namespace std; void Reverse(char* pStartStr,char* pEndStr) { assert(pStartStr && pEndStr); assert(pEndStr >= pStartStr); char cTmp; while (pEndStr > pStartStr) { cTmp = *pStartStr; *pStartStr = *pEndStr; *pEndStr = cTmp; pStartStr++; pEndStr--; } } char* ReverseSent(char* pStr) { assert(pStr); int nLenStr = strlen(pStr); if (nLenStr == 0) { return ""; } //翻转单词 char* pStartWord = pStr; char* pEndWord = pStr; while(*pStartWord != 0) { if (*pStartWord == ' ') { pStartWord++; pEndWord++; } else if (*pEndWord == 0 || *pEndWord == ' ') { pEndWord--; Reverse(pStartWord,pEndWord); pStartWord = ++pEndWord; } else { pEndWord++; } } //翻转句子 Reverse(pStr,pStr + nLenStr - 1); return pStr; } int main() { char Str[100] = " I am a Student. "; cout<<ReverseSent(Str)<<endl; system("pause"); return 1; }这里建议,使用思路一写代码,因为在处理左旋转字符串或者右旋转字符串时,就可以按照统一的思路做了,不易混淆。
左旋转字符串
题目:
所谓左旋:就是把字符串左边若干个单词移动到字符串尾部
举例:abcdefg - 左旋2位 - cdefgab
观察:把左边的字符串移动到右边时,其移动的字符串时整体移动的,内部字符也没有变化。这和问题一的思路是一样的。
思路:和第一个题目类似,可以根据旋转的单词个数,把字符串分成两部分XY。之后进行旋转。
旋转时注意:原始串为XY,目标串为YX。
步骤:
先对每一部分旋转,abcdefg 变成bagfedc
之后,对整个字符串进行翻转。bagfedc - cdefgab
代码:
char* ReverseSent(char* pStr,int nCount) { assert(pStr); int nLenStr = strlen(pStr); if (nLenStr < nCount) { return pStr; } //处理字符串 char* pStartFirst = pStr; char* pEndFirst = pStr + nCount - 1; char* pStartSec = pEndFirst + 1; char* pEndSec = pStr + nLenStr - 1; //翻转单词 Reverse(pStartFirst,pEndFirst); Reverse(pStartSec,pEndSec); //翻转句子 Reverse(pStr,pStr + nLenStr - 1); return pStr; }
右旋转字符串
所谓右旋:就是把字符串右边若干个单词移动到字符串头部
举例:abcdefg- 右旋5位 - cdefgab
观察:其实和左旋差不多,区别就是旋转的单词长度变化了。
即,右旋五位,相当于左旋2位。
思路:把右旋转换为左旋做,就ok了。
代码:
char* ReverseSent(char* pStr,int nCount) { assert(pStr); int nLenStr = strlen(pStr); if (nLenStr < nCount) { return pStr; } //处理字符串 char* pStartFirst = pStr; char* pEndFirst = pStr + nLenStr - nCount - 1;// 和左旋的区别在这里 char* pStartSec = pEndFirst + 1; char* pEndSec = pStr + nLenStr - 1; //翻转单词 Reverse(pStartFirst,pEndFirst); Reverse(pStartSec,pEndSec); //翻转句子 Reverse(pStr,pStr + nLenStr - 1); return pStr; }