翻转字符串和左旋转字符串

左旋转:

class Solution {
public:
    string LeftRotateString(string str, int n) {
        int length = str.size();
        if(length <= 1 || n <= 0)
            return str;
        reverse(str,0,length-1);
        reverse(str,0,length-1-n);
        reverse(str,length-n,length-1);
        return str;
    }
    void reverse(string &str,int begin,int end){
        for(int i = begin;i <= (begin + end)/2;i++)
            swap(str[i],str[begin+end-i]);
    }
};

翻转:

class Solution {
public:
    string ReverseSentence(string str) {
        int length = str.size();
        if(length <= 0)
            return str;
        reverse(str,0,length-1);
        vector<int> blank;
        int num = 0;
        for(int i = 0;i < length;i++){
            if(str[i] == ' '){
                blank.push_back(i);
                num++;
            }
        }
        int begin = 0;
        int end;
        for(int i = 0;i < num;i++){
            end = blank[i] - 1;
            reverse(str,begin,end);
            begin = blank[i] + 1;
        }
        reverse(str,begin,length-1);//最后一个空白的部分实际上是没有翻转,这一步必须再进行翻转
        return str;
    }
    void reverse(string &str,int begin,int end){
        for(int i = begin;i <= (begin + end)/2;i++)
            swap(str[i],str[begin+end-i]);
    }
};

左旋转在abcdefg,7的时候出问题

翻转字符串在输入例子为一个空格的字符串的时候出问题,即" "

两个出问题其实都是在reverse函数出的问题。reverse(str,0,length-1-n)这行代码相当于reverse(str,0,-1),但(begin + end)/2得到的结果不是-1,而是0。因为i是int型,-0.5的int型是0,而不是-1。

当字符串为一个空格的时候,reverse(str,begin,end)是reverse(str,0,-1)和左旋转是一样的问题。

这两个都会造成blank[i] - 1结果为-1,造成数组越界

int型对小数是取整的,1.7的int是1,不是2,-1.7的int是-1,不是-1。

 

reverse的正确写法:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值