题目:一个数组A中存有 n 个整数,在不允许使用另外数组的前提下,将每个整数循环向右移 M( M >=0)个位置,即将A中的数据由(A0 A1 ……AN-1 )变换为(AN-M …… AN-1 A0 A1 ……AN-M-1 )(最后 M 个数循环移至最前面的 M 个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
题目分析:比如一个数组int[]={1,2,3,4,5,6};将数组右移2(m位)位1的位置移到3,2的位置移到4,3的位置移到5,4的位置移到6,如果5和6向后移,会数组越界,所以将5放到1的位置,6放到2的位置。要的结果是{5,6,1,2,3,4}想要达到这种效果1、首先我们可以将整个数组翻转为{6,5,4,3,2,1}2、根据位移的数,判断前半段和后半段,位移的数为2位前半段起始终止位为(0,m-1)将前半段翻转为{5,6}3、以此类推,将后半段翻转为(1,2,3,4)最后返回{5,6,1,2,3,4}要完成以上翻转,首先,我们需要创造一个翻转函数当起始点小于终止点时,循环替换起始和终止的位置,每循环一次,起始点增加,终止点减小。具体键代码。
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) {        //当m的值大于n时,取余是为了使m最小化        m = m%n;        //将数组所有翻转一遍        reverse(a,0,n - 1);        //将数组前半部分翻转        reverse(a,0,m - 1);        //将数组后半部分翻转        reverse(a, m, n - 1);        return a;        }        //定义一个翻转函数        public void reverse(int[] a,int start,int end){        //当起始下标小于终点下标时,替换两个下标的内容            while(start
输入:6,2,[1,2,3,4,5,6]输出:[5,6,1,2,3,4]