【leetcode】旋轉數組【C、Python】

來源:互聯網
上載者:User

標籤:next   net   環境   空間   mda   函數   旋轉   解答   檢驗   

題目:

 

給定一個數組,將數組中的元素向右移動 個位置,其中 是非負數。

樣本 1:

輸入: [1,2,3,4,5,6,7]k = 3輸出: [5,6,7,1,2,3,4]解釋:向右旋轉 1 步: [7,1,2,3,4,5,6]向右旋轉 2 步: [6,7,1,2,3,4,5]向右旋轉 3 步: [5,6,7,1,2,3,4]

樣本 2:

輸入: [-1,-100,3,99]k = 2輸出: [3,99,-1,-100]解釋: 向右旋轉 1 步: [99,-1,-100,3]向右旋轉 2 步: [3,99,-1,-100]

說明:

  • 儘可能想出更多的解決方案,至少有三種不同的方法可以解決這個問題。
  • 要求使用空間複雜度為 O(1) 的原地演算法。

 

題目分析:

對於像筆者這樣的小白來說,拿到這樣的題目第一思維是複製一個數組的副本,但題目要求的是“使用空間複雜度為 O(1) 的原地演算法",所以此方法應該PASS掉。
構思Python解題方案時很容易想到直接去對數組做K輪移動,比如剛開始筆者寫出了這樣的Python代碼:

 1 class Solution: 2     def rotate(self, nums, k): 3         """ 4         :type nums: List[int] 5         :type k: int 6         :rtype: void Do not return anything, modify nums in-place instead. 7         """ 8         for j in range(0,k): 9             temp=nums[len(nums)-1]10             for i in range(0,len(nums)-1):11                 nums[len(nums)-i-1]=nums[len(nums)-i-2]12             nums[0]=temp
錯誤執行個體

但事實證明這種方法太低效,沒有通過時間複雜度的檢驗。

筆者忘記了python不同與C的進階功能——切片。

 

對於用C的解題方式:

 有多種解題思路,可以參考這篇博文:80302654

 

筆者還嘗試了用C++解決這個問題,相對於用C解決此問題,C++的麻煩之處在於需要自己求出數組長度numsSize

筆者瞭解到在C語言下判斷一個數組中含有多少個元素的方法:

1、sizeof(array)/sizeof(array[0]);

2、sizeof(array)/sizeof(數組的類型,如int,double等)

但此方法並不可靠。原因:

開發工具和運行環境的不同,有時sizeof(int)得到的結果不一樣,作者在WinTC和VC++中的到的結果分別為2和4,這樣就不能得到正確(想要)的結果。

據說是int類型和運行環境有關,在16bits的情況下就是2,32bits的情況下是4。

另外C中規定了每種資料類型的表示範圍,但並沒有嚴格規定其位元組數。

 

不得不自己寫函數:

 

 

 1 #include <stdio.h> 2 int main(void) 3 { 4     int i=0; 5     int nums[]={1}; 6     int numsSize=0; 7     for(i=0;nums[i]!=NULL;i++) 8     { 9         numsSize++;10     }11     printf("%d",numsSize);12     return 0;13 }
數組長度計算

 

 

 1 class Solution { 2 public: 3     void rotate(vector<int>& nums, int k) { 4     int i=0;   5     int temp[100]; 6     int numsSize=0; 7     for(i=0;nums[i]!=NULL;i++) 8     { 9         numsSize++;10     }11     for(i=numsSize-1;i>numsSize-1-k;i--)    //沒有等號 i>=numsSize-1-k  12         temp[i+k-numsSize] = nums[i];   //儲存被覆蓋的數nums[i]  13     for(i=numsSize-1; i>=k; i--)  14         nums[i] = nums[i-k];            //nums[i]被覆蓋,提前儲存到temp中去, 再nums[i]=移位前一個數  15       16     for(i = 0; i<=k-1; i++)         //賦值  17         nums[i]=temp[i]; 18         19     };20 };
C++解決方案

 

遺憾的是:當輸入數組是只有一個元素的數組時,程式報錯,原因至今未查出,希望有路過的大神能指點指點!

錯誤資訊:

執行錯誤資訊:malloc(): memory corruption: 0x000000000258ae90 ***

最後執行的輸入:[1] 1

 

 

 

解答代碼:
C語言:
 1 void rotate(int* nums, int numsSize, int k) { 2     int now = 0,start = 0, data_to_next = 0, temp = 0;   3     int cnt = numsSize ;//用來表示跳轉次數,次數到了,就停止迴圈   4       5     k = k%numsSize;   6     if(k==0)   7         return;   8    9     for(start = 0;start<numsSize;start++)  10     {  11         now = start;  12         data_to_next =  nums[start%numsSize];   //第一個數,先提出來,用於 與下一個數交換  13         while(1)  14         {  15             now = now+k;  16           17             temp = nums[now%numsSize];           //交換一次         18             nums[now%numsSize] = data_to_next;  19             data_to_next = temp;  20             cnt--;        21               22             if((now%numsSize) == start)         //如果交換到start的開始,就結束本次跳轉交換  23                 break;  24                             25         }  26      27         if(cnt==0)  28             break;                  29     }     30   31     32 }

Python:

1 class Solution:2     def rotate(self, nums, k):3         """4         :type nums: List[int]5         :type k: int6         :rtype: void Do not return anything, modify nums in-place instead.7         """8         nums_len = len(nums)9         nums[:] = nums[nums_len - k :] + nums[:nums_len - k]

 




 

 

 

【leetcode】旋轉數組【C、Python】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.