zoukankan      html  css  js  c++  java
  • 面试题42:翻转单词顺序 || 左旋字符串

     翻转单词顺序

     注意ReverseSentence中if条件的顺序,开始把 if(*pBegin == ' ')和 if(*pEnd == ' ' || *pEnd == '') 顺序颠倒了,这样会陷入死循环

     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 != '')
    25         pEnd ++;
    26     pEnd--;
    27 
    28     // 翻转整个句子
    29     Reverse(pBegin, pEnd);
    30 
    31     // 翻转句子中的每个单词
    32     pBegin = pEnd = pData;
    33     while(*pBegin != '')
    34     {
    35         if(*pBegin == ' ')
    36         {
    37             pBegin ++;
    38             pEnd ++;
    39         }
    40         else if(*pEnd == ' ' || *pEnd == '')
    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 }
  • 相关阅读:
    蓝桥杯入门训练
    <泛> STL
    传递 hdu 5961 拓扑排序有无环~
    Alice and Bob hdu 4268
    Bipartite Graph hdu 5313 bitset 并查集 二分图
    Bomb HDU 3555 dp状态转移
    不要62 hdu 2089 dfs记忆化搜索
    Leaving Auction CF 749D
    Moo University
    算法(三)
  • 原文地址:https://www.cnblogs.com/raichen/p/5685187.html
Copyright © 2011-2022 走看看