題目一:輸入一個英文句子,翻轉句子中單詞的順序。但是單詞內字符的順序不變。爲簡單起見,標點符號和普通字母一樣處理。例如輸入字符串“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; }