给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入:[1,2,3,4,5,6,7]
和 k = 3 输出:[5,6,7,1,2,3,4]
解释: 向右旋转 1 步:[7,1,2,3,4,5,6]
向右旋转 2 步:[6,7,1,2,3,4,5]
向右旋转 3 步:[5,6,7,1,2,3,4]
示例 2:
输入: [-1,-100,3,99]
和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
代码:
package leetcode;
import java.util.Arrays;
import java.util.Scanner;
/**
* Created by Orange_X on 2019/11/21.
*/
public class Main{
public static void main(String[] args) {
int a[]={1,2,3,4,5,6,7};
int b[]=new int[a.length];
//ps:我的想法是看成一个顺时针排序环,初始start在1上。然后根据拨动的码数(n 非负数)来调整位置,n超过a.length(一周期),就%a.length获取新码数
Scanner in=new Scanner(System.in);
int x=in.nextInt()%a.length;
int l=x;
int y=x;
if(x==0){
//没变
System.out.println(Arrays.toString(a));
}else {
//a.length-x到a.length-1 + a[0]到a[a.length-x-1] 形成一个新数组
for(int i=x;x>0;x--){
b[i-x]=a[a.length-x];
}
for(int i=0;i<a.length-y;i++){
b[l]=a[i];
l++;
}
System.out.println(Arrays.toString(b));
}
}
}
leetcode通过:
class Solution {
public void rotate(int[] a, int k) {
//ps:如果这边int b[]=a; java机制直接把b的地址指向了a 当a因为底下代码发生改变的时候b也会改变 所以要重新new 一个地址给b
int b[]=new int[a.length];
for(int o=0;o<a.length;o++){
b[o]=a[o];
}
int x=k%a.length;
int l=x;
int y=x;
if(x==0){
//没变
a=a;
}else {
//a.length-x到a.length-1 + a[0]到a[a.length-x-1] 形成一个新数组
for(int i=x;x>0;x--){
a[i-x]=b[a.length-x];
}
for(int i=0;i<a.length-y;i++){
a[l]=b[i];
l++;
}
}
}
}