一个数组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 {
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--;
}
}
} // write code here
for(let i=0;i<n-m%n;++i){
a.push(a.shift())
}
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;
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;
}
} 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 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;
}
} 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;
}
}; 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--;
}
}
} 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;
}
}; class Solution: def solve(self , n: int, m: int, a: List[int]) -> List[int]: # write code here for i in range(m): a.insert(0,a[-1]) a.pop() 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]