【面试题042】翻转单词顺序VS左旋转字符串

【面试题042】翻转单词顺序VS左旋转字符串
题目一:
    输入一个英文句子,反转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。
    例如输入字符串“I am a student.”,则输出“student. a am I”。
思路一:
    反转字符串的顺序,这样子每个单词的顺序也反转了,然后再次反转每个单词,这样子就做到了题目要求。
——关键是实现一个函数以反转字符串中的一段。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 
#include <iostream>

using  namespace std;


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(pBegin, --pEnd);
            pBegin = ++pEnd;
        }
         else
        {
            pEnd ++;
        }
    }

     return pData;
}

int main()
{
     char str[] =  "I am a student.";

    ReverseSentence(str);
    printf( "%s\n", str);

     return  0;
}
 
 
题目二:
    字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的末尾。请定义一个函数实现字符串左旋转操作的功能。
比如输入字符串“abcdefg”和数字2,该函数将返回左旋转2位得到的结果“cdefgab”。
 
思路一:
    前两个字符ab为一部分,后面五个字符为一部分cdefg,然后两次反转,即可达到目的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
#include <iostream>
#include <string>
using  namespace std;


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 *LeftRotateString( char *pStr,  int n)
{
     if (pStr !=  NULL)
    {
         int nLength =  static_cast< 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;
}

int main()
{
     char str[] =  "abcdefg";
    LeftRotateString(str,  2);
    printf( "%s\n", str);

     return  0;
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/codemylife/p/3762141.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值