剑指offer刷题————翻转单词顺序 VS 左旋转字符串

题目1

问题重述:

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

思路解析:

对于这个题目,我们可以先将字符串整体进行翻转,然后再在每个单词的内部进行翻转,即得到我们想要的答案,具体见代码。

代码实现:

class Solution {
public:
    string ReverseSentence(string str) {
        //先将整体翻转,再在每个单词内部进行反转
        //翻转句子
        Reverse(str,0,str.size()-1);
        //单词内部进行反转
        int current = 0;
        int start = 0;
        int end = 0;
        while(end<str.size())
        {
            if(end==str.size()-1)
            {
                Reverse(str,start,end);
            }
            else if(str[end]==' ')
            {
                Reverse(str,start,end-1);
                start = end+1;
            }
            ++end;
        }
        return str;
    }
    void Reverse(string &str,int start,int end)
    {
        while(start<end)
        {
            char temp = str[end];
            str[end] = str[start];
            str[start] = temp;
            ++start;
            --end;
        }
    }
    
};

题目2

问题重述:

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

思路解析:

首先我们记字符串的长度位len,左旋转位数位n,我们首先将字符串0~n-1进行翻转,然后将字符串n~length进行翻转,最后将字符串整体进行翻转,即可以得到我们想要的答案。

代码实现:

class Solution {
public:
    string LeftRotateString(string str, int n) {
        int length = str.size()-1;
        if(n>length||n<=0)
            return str;
        //先分步翻转,再整体翻转
        Reserve(str, 0, n-1);
        Reserve(str, n,length);
        Reserve(str, 0, length);
        return str;
        
    }
    void Reserve(string &str,int start,int end)
    {
        while(start<end)
        {
            char temp = str[start];
            str[start] = str[end];
            str[end] = temp;
            ++start;
            --end;
        }
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值