一个数组A中存有 n 个整数,在不允许使用另外数组的前提下,将每个整数循环向右移 M( M >=0)个位置,即将A中的数据由(A0 A1 ……AN-1 )变换为(AN-M …… AN-1 A0 A1 ……AN-M-1 )(最后 M 个数循环移至最前面的 M 个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
数据范围:,
进阶:空间复杂度 ,时间复杂度
6,2,[1,2,3,4,5,6]
[5,6,1,2,3,4]
4,0,[1,2,3,4]
[1,2,3,4]
(1<=N<=100,M>=0)
import java.util.*; public class Solution { /** * 旋转数组 * @param n int整型 数组长度 * @param m int整型 右移距离 * @param a int整型一维数组 给定数组 * @return int整型一维数组 */ public int[] solve (int n, int m, int[] a) { // write code here int mm=m%n; for (int count=0;count<mm;count++){ // 这个方法是自己想的,起初打算用一个变量暂存,然后依次往后存数, // 发现一个变量不够用,于是想到可以用两个变量交替存, // 但是交替带来了奇偶的问题。最后需要注意i+1带来边界溢出的问题,故需要取余 int t1=a[0],t2=a[1]; for (int i=0;i<n;i++){ if(i%2==0){ t2=a[(i+1)%(n)]; a[(i+1)%(n)]=t1; } if(i%2==1){ t1=a[(i+1)%(n)]; a[(i+1)%(n)]=t2; } } } return a; } }
import java.util.*; public class Solution { /** * 旋转数组 * @param n int整型 数组长度 * @param m int整型 右移距离 * @param a int整型一维数组 给定数组 * @return int整型一维数组 */ public int[] solve (int n, int m, int[] a) { // write code here m = m%n; reverse(a,0,n-m-1); reverse(a,n-m,n-1); reverse(a,0,n-1); return a; } public void reverse(int[] a,int start,int end){ int i = start; int j = end; while(i<j){ int tem = a[i]; a[i] = a[j]; a[j] = tem; i++; j--; } } }
import java.util.*; public class Solution { public int[] solve (int n, int m, int[] a) { int k=m%n; reverse(a,0,n-1); reverse(a,0,k-1); reverse(a,k,n-1); return a; } public void reverse(int[] a,int start,int end){ while (start<end){ int temp=a[start]; a[start]=a[end]; a[end]=temp; start++; end--; } } }
import java.util.*; public class Solution { /** * 旋转数组 * @param n int整型 数组长度 * @param m int整型 右移距离 * @param a int整型一维数组 给定数组 * @return int整型一维数组 */ public int[] solve (int n, int m, int[] a) { // write code here m=m%n; m=n-m; for(int i=0;i<m/2;i++){ int temp=a[i]; a[i]=a[m-1-i]; a[m-1-i]=temp; } for(int i=m;i<(a.length+m)/2;i++){ int temp=a[i]; a[i]=a[a.length-1+m-i]; a[a.length-1+m-i]=temp; } for(int i=0;i<a.length/2;i++){ int temp=a[i]; a[i]=a[a.length-1-i]; a[a.length-1-i]=temp; } return a; } }
// write code here for(let i=0;i<n-m%n;++i){ a.push(a.shift()) } return a }
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 int z = m % n; reverse(a.begin(),a.end()); reverse(a.begin(),a.begin()+z); reverse(a.begin()+z,a.end()); return a; } };
import java.util.*; public class Solution { /** * 旋转数组 * @param n int整型 数组长度 * @param m int整型 右移距离 * @param a int整型一维数组 给定数组 * @return int整型一维数组 */ public int[] solve (int n, int m, int[] a) { // write code here int temp=0; for(int t=1;t<=m;t++){ temp=a[n-1]; for(int i=n-2;i>=0;i--){ a[i+1]=a[i]; } a[0]=temp; } return a; } }
6,2,[1,2,3,4,5,6]三次翻转:
import java.util.*; public class Solution { public int[] solve (int n, int m, int[] a) { m = m % n; for (int i = 0; i < m; i++) for (int j = i + m; j % n != i; j++) {//一次交换后,元素便放置到了正确位置 int tmp = a[i]; a[i] = a[j % n]; a[j % n] = tmp; } return a; } }
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 int r = m % n; if (r == 0) return a; while (r > 0) { int temp = a[n-1]; for (int i = n - 1; i > 0; --i) { a[i] = a[i - 1]; } a[0] = temp; --r; } return a; } };
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 if (n == 0 || (m %= n) == 0) return a; reverse(a.begin(), a.begin() + n - m); reverse(a.begin() + n - m, a.end()); reverse(a.begin(), a.end()); return a; } };
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 //n表示数组中的整数个数,m表示右移个数,可以遍历输出 //为了保留原始顺序,动态数组b作为a的拷贝 vector<int> b = a; if (m > n) m = m % n; for(int i = 0; i < m; i++) { a[i] = a[n - m + i]; } for (int j = m; j < n; j++) { a[j] = b[j - m]; } return a; } };
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 旋转数组 # @param n int整型 数组长度 # @param m int整型 右移距离 # @param a int整型一维数组 给定数组 # @return int整型一维数组 # class Solution: def solve(self , n: int, m: int, a: List[int]) -> List[int]: if m == 0: return a loc = n - m % n return a[loc:] + a[:loc]
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) { // 时间复杂度O(N),空间复杂度O(1) m %= n; reverse(a, 0, n - 1); reverse(a, 0, m - 1); reverse(a, m, n - 1); return a; } void reverse(vector<int> &a, int left, int right) { while (left < right) { a[left] = a[left] ^ a[right]; a[right] = a[left] ^ a[right]; a[left] = a[left] ^ a[right]; ++left; --right; } } };