翻转单词顺序 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 tmp = *pBegin;
        *pBegin = *pEnd;
        *pEnd = tmp;
        pBegin++;
        pEnd--;
    }
}

char* reverseSentence(char *pDate)
{
    if (pDate == NULL)
        return NULL;
    char *pBegin = pDate;
    char *pEnd = pDate;
    while (*pEnd != ‘\0‘)
        pEnd++;
    pEnd--;
    reverse(pBegin, pEnd);

    pBegin = pEnd = pDate;
    while (*pBegin != ‘\0‘)
    {
        if (*pBegin == ‘ ‘)
        {
            pBegin++;
            pEnd++;
        }
        else if (*pEnd == ‘ ‘ || *pEnd == ‘\0‘)
        {
            reverse(pBegin, --pEnd);
            pBegin = ++pEnd;
        }
        else
            pEnd++;
    }
    return pDate;
}

题目二:

  字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串“abcdefg”和数字2,该函数将返回左旋转2位得到的结果“cdefgab”。

ANSWER:

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 = pFirstStart + n - 1;
            char *pSecondStart = pFirstStart + n;
            char *pSecondEnd = pStr + nLength - 1;
            reverse(pFirstStart, pFirstEnd);
            reverse(pSecondStart, pSecondEnd);
            reverse(pFirstStart, pSecondEnd);
        }
    }
    return pStr;
}

LeetCode上也有对应的题目

https://leetcode.com/problems/reverse-words-in-a-string/

时间: 2024-10-05 21:05:21

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

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

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

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

剑指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",此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了,第二步再翻转每个单词中字符的顺

【程序员编程艺术】学习记录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

【剑指offer】左旋转字符串

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27366485 题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S="abcXYZdef",要求输出循环左移3位后的结果,即"XYZdefabc".是不是很简单?OK,搞定它! 输入: 多组测试数据,每个测试数据包含一个