面试题42:翻转单词顺序 || 左旋字符串
翻转单词顺序
注意ReverseSentence中if条件的顺序,开始把 if(*pBegin == ' ')和 if(*pEnd == ' ' || *pEnd == '\0') 顺序颠倒了,这样会陷入死循环
1 void Reverse(char *pBegin, char *pEnd) 2 { 3 if (pBegin == NULL || pEnd == NULL) 4 return; 5 6 while (pBegin < pEnd) 7 { 8 char temp = *pBegin; 9 *pBegin = *pEnd; 10 *pEnd = temp; 11 pBegin++; 12 pEnd--; 13 } 14 } 15 16 char* ReverseSentence(char *pData) 17 { 18 if(pData == NULL) 19 return NULL; 20 21 char *pBegin = pData; 22 23 char *pEnd = pData; 24 while(*pEnd != '\0') 25 pEnd ++; 26 pEnd--; 27 28 // 翻转整个句子 29 Reverse(pBegin, pEnd); 30 31 // 翻转句子中的每个单词 32 pBegin = pEnd = pData; 33 while(*pBegin != '\0') 34 { 35 if(*pBegin == ' ') 36 { 37 pBegin ++; 38 pEnd ++; 39 } 40 else if(*pEnd == ' ' || *pEnd == '\0') 41 { 42 Reverse(pBegin, --pEnd); 43 pBegin = ++pEnd; 44 } 45 else 46 { 47 pEnd ++; 48 } 49 } 50 51 return pData; 52 }
左旋字符串
题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。
方法一:
1 char* LeftRotateString(char* pStr, int n) 2 { 3 if(pStr != NULL) 4 { 5 int nLength = static_cast<int>(strlen(pStr)); 6 if(nLength > 0 && n > 0 && n < nLength) 7 { 8 char* pFirstStart = pStr; 9 char* pFirstEnd = pStr + n - 1; 10 char* pSecondStart = pStr + n; 11 char* pSecondEnd = pStr + nLength - 1; 12 13 // 翻转字符串的前面n个字符 14 Reverse(pFirstStart, pFirstEnd); 15 // 翻转字符串的后面部分 16 Reverse(pSecondStart, pSecondEnd); 17 // 翻转整个字符串 18 Reverse(pFirstStart, pSecondEnd); 19 } 20 } 21 22 return pStr; 23 }
方法二:
将字符串拼接然后再选取,用string类型更方便
1 char* LeftRotateString(char* pStr, int n) 2 { 3 if(pStr != NULL) 4 { 5 char *twoStr = new char[strlen(pStr) * 2 + 1]; 6 strcpy(twoStr,pStr); 7 strcat(twoStr,pStr); 8 9 char *strBegin = twoStr + n; 10 char *strEnd = strBegin + strlen(pStr) - 1; 11 12 char *pData = pStr; 13 while (strBegin <= strEnd) 14 *pData++ = *strBegin++; 15 delete [] twoStr; 16 } 17 return pStr; 18 19 }