1. 程式人生 > 其它 >【牛客提霸】-位元組跳動-旋轉陣列-reverse()

【牛客提霸】-位元組跳動-旋轉陣列-reverse()

技術標籤:演算法刷題

【思路】

老朋友了,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;
    }