题目描述
一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1 ……AN-1 )变换为(AN-M …… AN-1 A0 A1 ……AN-M-1 )(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
题解:
很多人都用额外的变量来实现移动,我这提供一个比较巧妙的思路
[1,2,3,4,5,6]—>[5,6,1,2,3,4]
我们可以先将整个数组翻转
就成:[6,5,4,3,2,1]
因为是移动m,所以我们前m个数字再翻转
就成:[5,6,4,3,2,1]
我们再将第m+1位到最后,所有数翻转
就成:[5,6,1,2,3,4]
这样就实现了移动,还没有用到其他任何变量
代码:
class Solution {
public:
/** * 旋转数组 * @param n int整型 数组长度 * @param m int整型 右移距离 * @param a int整型vector 给定数组 * @return int整型vector */
vector<int> solve(int n, int m, vector<int>& a) {
// write code here
m = m%n;
reverse(a.begin(), a.end());
reverse(a.begin(), a.begin()+m);
reverse(a.begin()+m, a.end());
return a;
//return a;
}
};