標籤:面試題
數組迴圈移動
個人資訊:就讀於燕大本科軟體工程專業 目前大三;
本人部落格: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];}}}}}