剑指offer58:翻转字符串

题目一:

 分析:这题嘛,我们可以从后往前找每一个单词的一个区间范围,然后分割下来,加到答案里面,既然是区间,我们需要两个变量记录,然后还要用一个变量记录字符串是否遍历完,代码如下所示:

class Solution {
public:
    string reverseWords(string s) {
        string ans;
        int k=s.size()-1;
        while(k>=0)
        {
            while(k>=0 && s[k]==' ')
            {
                --k;
            }
            int i=k;
            while(k>=0 && s[k]!=' ')
            {
                --k;
            }
            int j=k;
            if(j<i)
            {
                ans+=s.substr(j+1,i-j);
                ans+=" ";
            }
        }
        return ans.substr(0,ans.size()-1);
    }
};

结果如下所示:

当然,书里边的思路是这样的,先写一个函数,输入是区间,功能是反转这个区间的字符串。于是总的思路变成先把所有字符串翻转,再从头到尾一个一个单词反转,也是一个可行的办法。

题目二:

 分析:这题...可以先看看投机的做法,调库完事了:

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        int len=s.size();
        string ans=s.substr(n);
        ans+=s.substr(0,n);
        return ans;
    }
};

结果如下所示:

当然,我们得学点东西对吧,受到第一题的启发,我们可以这样做,拿s=abcdefg,n=2的题目中的栗子来说,首先我们翻转前两位变成ba,翻转后面的变成gfedc,拼起来bagfedc再翻转,没错,就是答案cdefgab。所以我们要做的是什么呢,要做的是将字符串的两部分分别翻转,然后整个字符串再翻转就好了~代码如下所示:

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s.begin(),s.begin()+n);
        reverse(s.begin()+n,s.end());
        reverse(s.begin(),s.end());
        return s;
    }
};

结果如下所示:

 这样做有个什么好处呢?我们是只在原字符串上修改,节省了空间的代价~从O(n)降低为O(1)?或许~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值