一、問題描述
定義字串的左旋轉操作:把字串前面的若干個字元移動到字串的尾部。
如把字串abcdef左旋轉2位得到字串cdefab。
請實現字串左旋轉的函數,要求對長度為n的字串操作的時間複雜度為O(n),空間複雜度為O(1)。
二、演算法分析
實現此函數的功能並不複雜,複雜之處在於對函數在時間和空間上提出的要求。看到別人提出了一種很好的演算法,能夠在時間和空間上滿足要求,演算法流程圖如下:先反轉前r個字元,再反轉後n-r個字元,最後反轉整個數組。這樣既實現了功能,又在時空上都滿足了限制。
演算法流程圖
三、代碼實現
/*Description:array_len means the array's length, this function can swap the numbers from array[begin] to array[end]output:void此函數實現了反轉給定數組array[array_len]中從array[begin]到array[end]中的元素的功能,要求輸入滿足:0<=begin<=end<array_len */void swap_array(int array[], int array_len, int begin, int end){ int i = 0; int temp = 0; int sum = 0; int len = 0; sum = begin + end; len = end - begin + 1; if(begin < 0 || end >= array_len || begin > end) { printf("error: wrong value of begin or end !\n"); exit(1); } if(begin == end) //only one value, and it's not necessary to change, it's ok { return ; } for(i = begin; i < begin + len / 2; i ++) { temp = array[i]; array[i] = array[sum -i]; array[sum -i] = temp; }}void left_circle_r_position(int array[], int array_len, int r){if(array_len < 0 || r < 0 || r > array_len){printf("wrong parameter !\n");exit(1);}if(r == array_len || r == 0) //it's already ok{return ;}swap_array(array, array_len, 0, r-1);swap_array(array, array_len, r, array_len);swap_array(array, array_len, 0, array_len);}void display_array(int array[], int array_len){int i = 0;for(i = 0; i < array_len; i ++){printf("%3d",array[i]);}printf("\n");}