面试题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 }

 

posted on 2016-07-19 21:33  已停更  阅读(200)  评论(0编辑  收藏  举报