1. 程式人生 > >翻轉字符串和左旋轉字符串

翻轉字符串和左旋轉字符串

轉字符串 ever string ret test tro 翻轉字符串 字符串 lan

左旋轉:

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的正確寫法:

翻轉字符串和左旋轉字符串