翻轉字符串和左旋轉字符串
阿新 • • 發佈:2018-04-18
轉字符串 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) returnstr; 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(inti = 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的正確寫法:
翻轉字符串和左旋轉字符串