翻转单词顺序

Posted 三颗心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了翻转单词顺序相关的知识,希望对你有一定的参考价值。

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。

思路:首先将整个句子按字符翻转,然后再将其中每个单词的字符旋转。

 1 #include <string>
 2 #include "stdafx.h"
 3 
 4 void Reverse(char *pBegin, char *pEnd)
 5 {
 6     if(pBegin == NULL || pEnd == NULL)
 7         return;
 8     
 9     while(pBegin < pEnd)
10     {
11         char temp = *pBegin;
12         *pBegin = *pEnd;
13         *pEnd = temp;
14         
15         pBegin ++, pEnd --;
16     }
17 }
18 
19 char* ReverseSentence(char *pData)
20 {
21     if(pData == NULL)
22         return NULL;
23 
24     char *pBegin = pData;
25 
26     char *pEnd = pData;
27     while(*pEnd != \'\\0\')
28         pEnd ++;
29     pEnd--;
30 
31     // 翻转整个句子
32     Reverse(pBegin, pEnd);
33 
34     // 翻转句子中的每个单词
35     pBegin = pEnd = pData;
36     while(*pBegin != \'\\0\')
37     {
38         if(*pBegin == \' \')
39         {
40             pBegin ++;
41             pEnd ++;
42         }
43         else if(*pEnd == \' \' || *pEnd == \'\\0\')
44         {
45             Reverse(pBegin, --pEnd);
46             pBegin = ++pEnd;
47         }
48         else
49         {
50             pEnd ++;
51         }
52     }
53 
54     return pData;
55 }
56 
57 
58 int main()
59 {
60     char input[] = "I am a student.";
61     printf("%s\\n\\n",input);
62     printf("After reverse.\\n\\n");
63     ReverseSentence(input);
64     printf("%s\\n", input);
65     
66     return 0;
67 }

题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 

思路:把字符串分为两个部分,先分别翻转这两部分,接下来再翻转整个字符串。

 1 #include <string>
 2 #include "stdafx.h"
 3 
 4 void Reverse(char* pBegin, char* pEnd)
 5 {
 6     if(pBegin == NULL || pEnd == NULL)
 7         return;
 8 
 9     while(pBegin < pEnd)
10     {
11         char temp = *pBegin;
12         *pBegin = *pEnd;
13         *pEnd = temp;
14 
15         pBegin++;
16         pEnd--;
17     }
18 }
19 
20 char* LeftRotateString(char* pStr, int n)
21 {
22     if(pStr != NULL)
23     {
24         int nLength = static_cast<int>(strlen(pStr));
25         if(nLength > 0 && n > 0 && n < nLength)
26         {
27             char *pFirstStart = pStr;
28             char *pFirstEnd = pStr + n - 1;
29             char *pSecondStart = pStr + n;
30             char *pSecondEnd = pStr + nLength - 1;
31             
32             Reverse(pFirstStart, pFirstEnd);
33             Reverse(pSecondStart, pSecondEnd);
34             Reverse(pFirstStart, pSecondEnd);
35         }
36     }
37     
38     return pStr;
39 }
40 
41 int main(int argc, char const *argv[])
42 {
43     char input[] = "abcdefg";
44     printf("the initial is :%s\\n", input);
45     int num = 2;
46     char* result = LeftRotateString(input, num);
47     printf("after left rotate : %s\\n", result);
48     
49     return 0;
50 }

以上是关于翻转单词顺序的主要内容,如果未能解决你的问题,请参考以下文章

2022&2023华为OD机试 - 单词反转 2(Python)

华为OD机试 - 单词反转(Python)| 真题含思路

《剑指Offer——57.和为s的两个数字,58.翻转单词顺序》代码

华为OD机试 - 单词反转(JavaScript) | 机试题算法思路 2023

最强解析面试题:翻转单词顺序序列

Java 剑指offer(58-1) 翻转单词顺序