【牛客提霸】-位元組跳動-旋轉陣列-reverse()
阿新 • • 發佈:2021-01-15
技術標籤:演算法刷題
【思路】
老朋友了,408考研真題https://blog.csdn.net/qq_39328436/article/details/108555686
在刷牛客的過程中,遇到了三個408真題,基本上一摸一樣的思路,有一些就沒有寫部落格記錄下來了,但是這個題目雖然記得思路,但是做起來遇到了很多麻煩。
在做408的時候,翻轉是用程式碼自己實現的,但是c++有reverse函式,那我就得好好用一用了。
vector<int> solve(int n, int m, vector<int>& a) { reverse(a.begin(), a.end()); reverse(a.begin(), a.begin() +m-1); reverse(a.begin() +m, a.end()); return a; }
第一次程式碼是上面這樣寫的,第一次翻轉全部,第二次翻轉前半部分,第三次翻轉後半部分,但是結果有錯誤,錯就錯在對reverse函式沒有好好理解透徹
reverse(a.begin(), a.end());
a.begin()指向第一個元素的位置
a.end()指向的是最後一個元素的後一個位置
所以 reverse(a.begin(), a.begin() +m-1);翻轉了0~m-2 而reverse(a.begin() +m, a.end());翻轉了m~最後,丟掉了m-1位置上的元素
因此正確的翻轉應該是
vector<int> solve(int n, int m, vector<int>& a) { reverse(a.begin(), a.end()); reverse(a.begin(), a.begin() +m); reverse(a.begin() +m, a.end()); return a; }
在VS裡面不再報錯了,但是在牛客的編輯器裡面報錯
檢查了很久著實沒有發現哪一處越界了,參考了別人的程式碼發現少了一個判斷條件,下面這樣才能完全沒問題。錯誤原因在於潛意識裡認為m<n,但是實際上m可以很大,所以a.begin() +m很可能越界,所以必須要進行一個取餘操作才可以。
vector<int> solve(int n, int m, vector<int>& a) { m=m%n; if(n==0||m == 0)return a; reverse(a.begin(), a.end()); reverse(a.begin(), a.begin() +m); reverse(a.begin() +m, a.end()); return a; }