旋转的次数是,数组长度n 和 旋转位数 k的最大公约数
折腾了俩小时才琢磨出来,笨死我了
#include<iostream> #include<vector> #include<string> #include<ctime> #include<queue> #include<cassert> #include<algorithm> using namespace std; class Solution { public: void rotate(vector<int>& nums, int k) { int cur_index,next_index,cur; int n = nums.size(); cout <<"n:"<< n << endl; cout << "k:" << k<< endl; //i属于[0.......n-k-1]时,应该往后移k位,+k //i属于[n-k......n-1]时,下标变为i-(n-k) k = k%n; if (n == 0 || n == 1||k==0) return; //旋转的次数就是n和k的最大公约数 //求n和k的 int a = n,b = k; while (a != b) { if (a>b) { a = a - b; } else { b = b - a; } } int rotate_count = a; cout << "rotate:" << rotate_count << endl; for (int i = 1; i <= rotate_count; i++) { cur_index = n - k - i; cur = nums[cur_index]; next_index = cur_index + k; int temp = nums[next_index]; nums[next_index] = cur; cur = temp; cur_index = next_index; while (cur_index != n - k - i) { if (cur_index >= 0 && cur_index <= n - k - 1) { next_index = cur_index + k; int temp = nums[next_index]; nums[next_index] = cur; cur = temp; cur_index = next_index; } if (cur_index >= n - k && cur_index <= n - 1) { next_index = cur_index - (n - k); int temp = nums[next_index]; nums[next_index] = cur; cur = temp; cur_index = next_index; } } cout << "开始第"<<i<<"部分旋转" << endl; for (int i = 0; i < n; i++) cout << nums[i] << " "; cout << endl; } } }; int main() { vector<int> arr = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 }; //vector<int> arr = { 1,2,3,4,5,6,7,8,9,10 }; Solution().rotate(arr,45); return 0; }