42.翻转单词顺序VS左旋转字符串

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);

}

else

{

pEnd++;

}

}

return pData;

}

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;

//翻转字符串的前面n个字符

Reverse(pFirstStart, pFirstEnd);

//翻转字符串的后面部分

Reverse(pSecondStart, pSecondEnd);

//翻转整个字符串

Reverse(pFirstStart, pSecondEnd);

}

}

return pStr;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-15 09:28:13

42.翻转单词顺序VS左旋转字符串的相关文章

翻转单词顺序 VS 左旋转字符串

全部内容来自<剑指offer>. 题目一: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字符一样处理.例如输入字符串“I am a student.”,则输出 “student. a am I”. ANSWER: void reverse(char *pBegin, char *pEnd) { if (pBegin == NULL || pEnd == NULL) return; while (pBegin < pEnd) { char tm

翻转单词顺序与左旋转字符串

题目一:输入一个英文句子,翻转句子中单词的顺序.但是单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a student.",则输出"student. a am I". 分析:经典题目.先将整句翻转,再将每个单词翻转就可以了. 实现如下: void Reverse(char* pBegin,char* pEnd) {     if(pBegin==NULL||pEnd==NULL)         return;        

剑指offer-翻转单词顺序VS左旋转字符串

题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字啊的顺序不变.为简单起见,标点符号和普通字母一样处理. 举例说明 例如输入字符串”I am a student. ”,则输出”student. a am I”. 解题思路 第一步翻转句子中所有的字符.比如翻转“I am a student. ”中所有的字符得到”.tneduts a m a I”,此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了.第二步再翻转每个单词中字符的顺序,就得到了”student. a am I”.这正

反转单词顺序 VS 左旋转字符串

题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标垫符号和普通字母一样处理.例如输入字符串"I am a student.",则输出"student. a am I ". 解题思路:第一翻转句子中所有的字符.比如翻转"I am a student."中所有的字符得到".tneduts a ma I",此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了,第二步再翻转每个单词中字符的顺

42翻转单词顺序列+注意该题找单词的方法

题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"student. a am I".后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.".Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 思路:两步反转法,先整体反转,然后每个单词进行反转. 找单词的方法是找相应的空格. 如果sta

【程序员编程艺术】学习记录1:左旋转字符串之指针翻转法

[程序员编程艺术]学习记录1:左旋转字符串之指针翻转法 题目:左旋转字符串 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位得到字符串cdefab.请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(n) 思路一.暴力移位法 //暴力移位法 void leftshiftone(char *s, int n) { char t = s[0]; for(int i = 1;i < n; i++) s[i-1]

程序员编程技术学习笔记——左旋转字符串

程序员编程技术学习笔记--左旋转字符串 1.    题目描述 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串"abcdef"前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串"cdefab".请写一个函数完成此功能,要求对长度为n的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1). 2.    解法1:暴力左移 这个解法简单粗暴易想!你不是要以为k个字符吗,我先移动一位,然后把移动一位的函数运行k次就好啦~~

笔试算法题(13):反转链表 &amp; 左旋转字符串

出题:反转链表(递归和非递归解法): 分析:有递归跟非递归实现,注意对原始链表头节点的处理,因为其他节点都指向下一个节点,其需要指向NULL: 解题: 1 struct Node { 2 int v; 3 Node *next; 4 }; 5 Node* NonRecursiveListReverse(Node *head) { 6 if(head == NULL) return NULL; 7 Node *previous=NULL, *current=head, *temp=NULL; 8

左旋转字符串-剑指Offer

左旋转字符串 题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”.是不是很简单?OK,搞定它! 思路 借助于字符串翻转,若要左旋转前n个字符串,就先翻转整个字符串,再分别翻转前n个和后面的字符 代码 public class Solution { public String Le