数组的旋转的解法

来源:互联网 发布:园林效果图设计软件 编辑:程序博客网 时间:2024/05/21 06:46

数组长度为n,向右旋转k(0 <=k<=n)

方法一

(1)    如果k=0或者k=n,直接返回

(2)    否则,将[0,n-1]数组元素反转,然后[0, k-1]返回,[k,n-1]反转

代码如下
class Solution{public:void rotate(vector<int>&nums, int k){int len = nums.size();if (k == 0 || k == len) return;int start = 0, end = len - 1;while (start < end){swap(nums[start], nums[end]);start++, end--;}start = 0, end = k - 1;while (start < end){swap(nums[start], nums[end]);start++, end--;}start = k, end = len - 1;while (start < end){swap(nums[start], nums[end]);start++, end--;}}};

方法二

(1) 如果k=0或者k=n,直接返回

(2)    将两段数据数据依次交换,隔开的位置为middle=n-k,两段数据的起始位置依次为first1=0,first2=middle,遍历first2直到first2=len,过程中如果first1=middle,将middle=first2

(3)    将first2=middle,再次遍历直到first2=len,过程中如果first1=middle,将middle=first2,注意在first1不等于middle但是first2=len时,将first2=middle

代码如下

class Solution{public:    void rotate(vector<int>& nums, int k)    {        int len = nums.size();        if (k == 0 || k == len) return;        int middle = len - k;        int first1 = 0, first2 = middle;        do        {            swap(nums[first1], nums[first2]);            first1++, first2++;            if (first1 == middle)            {                middle = first2;            }        } while (first2 != len);        first2 = middle;        while (first2 != len)        {            swap(nums[first1], nums[first2]);            first1++, first2++;            if (first1 == middle)            {                middle = first2;            }            else if (first2 == len)            {                first2 = middle;            }        }    }};

方法三

(1)    如果两段数据长度相等,直接相互替换返回

(2)    否则,计算n与(n-k)的最大公约数d,循环d次,如果n-k<k,在循环过程中,当下标大于k时,往回退a[cur]=a[cur-k],cur-=k,其它就正常操作a[cur]=a[cur+k],cur+=k

(3)    如果n-k>k,在循环过程中,当下标加上n-k没有越界时,a[cur]=a[cur+n-k],cur+=n-k,其它就正常操作a[cur]=a[cur-k],cur-=k

代码如下

class Solution{public:void rotate(vector<int>&nums, int k){int n = nums.size();int a = n - k, b = k;if (a == b){int first1 = 0, first2 = k;for (int i = 0; i < k; i++) {swap(nums[first1], nums[first2]);first1++, first2++;}return;}int d = gcd(a, n);int tmp;int p = 0;for (int i = 0; i < d; i++){tmp = nums[i];p = i;if (a < b){for (int j = 0; j < b / d; j++){if (p > i + b){nums[p] = nums[p - b];p -= b;}nums[p] = nums[p + a];p += a;}}else{for (int j = 0; j < a / d - 1; j++){if (p + a < n){nums[p] = nums[p + a];p += a;}nums[p] = nums[p - b];p -= b;}}nums[p] = tmp;}}private:int gcd(int n, int m){if (m == 0) return n;else{return gcd(m, n % m);}}};

测试代码为

const int N = 7;int main(){vector<int> source;for (int i = 0; i < N; i++){source.push_back(i + 1);}Solution solver;for (int i = 0; i < N + 1; i++){vector<int> test = source;solver.rotate(test, i);copy(test.begin(), test.end(), ostream_iterator<int>(cout, " "));cout << endl;}return 0;}






0 0