數組迴圈移動

來源:互聯網
上載者:User

標籤:面試題

數組迴圈移動

個人資訊:就讀於燕大本科軟體工程專業 目前大三;

本人部落格:google搜尋“cqs_2012”即可;

個人愛好:酷愛資料結構和演算法,希望將來從事演算法工作為人民作出自己的貢獻;

程式設計語言:C++ ;

編程壞境:Windows 7 專業版 x64;

編程工具:vs2008;

製圖工具:office 2010 powerpoint;

硬體資訊:7G-3 筆記本;


真言

向前走,不要猶豫,猶豫就是讓別人超越自己的最好機會。

題目

數組向右迴圈移動。

解法

我設計的演算法時間複雜度為O(n),空間複雜度為O(1)

演算法如下:n為數組長度,k為移動位元(這裡的k大有文章)

先考慮如果k<0,那就是向左移動;

在考慮如果k>n,這就是想說明k移動了好多次,確沒有必要,如果k == n,那就是移動以後,數組反而沒有變化;這時候我們怎麼辦呢 取k = k%n;

我的演算法分為了兩種情況

d =  min(k , n-k),

第一種情況是 n % d == 0 (這個需要多找個例子,多嘗試,然後可以找到規律)

第二種情況是 n % d != 0(這種情況比較簡單)

C++代碼錶示演算法

// 數組迴圈移位void Array::Roat_Right_Array(int *data,unsigned int const length,unsigned int k){//異常輸入if(data == NULL || length == 0 ){cout<<"異常輸入 Roat_Right_Array"<<endl;}// 正常輸入else{// 如果向左移,時要轉成向右移while(k < 0)k += length;k = k % length ;// 如果移動後整個數組沒變,那就不需要移動,否則需要移動,如下if(k != 0){int min = (k < (length/2))? k:length-k;// 能整除,意思是 不是一條龍if(length % min == 0){int dlater,dbefore;for(int j=0;j<min;j++){dlater = data[(j+k)%length];dbefore =data [j];for(unsigned int m=0,i=j;m < (length/min);m++){data[(i+k)%length] = dbefore;i = (i+k)%length;dbefore = dlater;dlater = data[(i+k)%length];}}}// 不能整除,意思是 一條龍else{int dbefore= data[0],dlater = data[k%length];for(unsigned int i=0,j=0;i<length;i++){data[(j+k)%length] = dbefore;j = (j+k)%length;dbefore = dlater ;dlater = data[(j+k)%length];}}}}}





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.