• 数组的循环右移问题(好未来笔试题)


    问题描述:给定一个整数数组,长度为n,现在要求该数组循环右以m个元素。

                 例如,数组为{1,2,3,4,5,6,7,8,9},循环右移3个元素后为变成{7,8,9,1,2,3,4,5,6}

    分析:这是我曾经参加好未来笔试时的一道编程题目,考完试后,总结了以下几种解法,给大家分享下。

            解法一:辅助空间法,思路很简单,就是另外开辟一块和原来数组一样大小的空间。然后先把原来数组的最后面的m个元素复制到 

                      新数组的前面,然后再把原来数组的前面的元素复制到新数组的后面,最后再把新数组的全部元素复制到原来的数组中,即可。

                     该方法很容易被想到,但是需要额外的辅助空间。

            解法二:三步操作法。

                     第一步:将原来数组全部反序。

                     第二步:再将前m个元素反序。

                     第三步:最后将后面的元素反序。

                     解法二不需要额外的辅助空间,是更好的解法。

    由于解法一很简单,我就不再些具体的代码了,针对解法二,写出了如下Java代码:

     1 public class Main13 {
     2     public static void reverse(int a[],int i,int j){        //用来实现反序
     3         int t;
     4         while(i<j)
     5         {
     6             t=a[i];
     7             a[i]=a[j];
     8             a[j]=t;
     9             i++;j--;
    10         }
    11     }
    12     
    13     public static void adjust(int a[],int m){               //实现右移位
    14         if(a==null){                                        //如果数组为空,则直接退出
    15             System.out.println("数组不存在");
    16             return;
    17         }
    18         if(m<0 ||m>a.length){                               //如果数组不合法则直接退出
    19             System.out.println("m的范围不对,不合法");
    20             return;
    21         }
    22         reverse(a,0,a.length-1);                            //第一步:全部反序
    23         reverse(a,0,m-1);                                   //第二步:再反序前m个数
    24         reverse(a,m,a.length-1);                            //第三步:最后反序后面的a.length-m个数
    25     }
    26     
    27     public static void main(String[] args) {
    28         // TODO 自动生成的方法存根
    29         int a[]={1,2,3,4,5,6,7,8,9};
    30         int m=3;
    31         System.out.print("原数组为:");
    32         for(int i=0;i<a.length;i++)
    33             System.out.print(a[i]+",");
    34         System.out.println();
    35         adjust(a,m);
    36         System.out.print("右移动"+m+"个后为:");
    37         for(int i=0;i<a.length;i++)
    38             System.out.print(a[i]+",");
    39     }
    40 
    41 }

    输出结果为:

    原数组为:1,2,3,4,5,6,7,8,9,
    右移动3个后为:7,8,9,1,2,3,4,5,6,

  • 相关阅读:
    Photoshop制作倒影的两种方法
    用CSS正确显示人民币符号的HTML转义字符
    CSS水平居中/垂直居中的N个方法
    有利于SEO的DIV+CSS的命名规则
    引用视频全屏播放代码
    分享:PHP获取MAC地址的实现代码
    设置nginx禁止通过IP访问服务器的方法
    php文件上传的例子
    apache开启gzip的方法
    perl命令批量替换文件内容
  • 原文地址:https://www.cnblogs.com/guozhenqiang/p/5469464.html
Copyright © 2020-2023  润新知