• 数组元素循环右移问题


    数组元素循环右移问题

    一、问题描述

      把一个含有 length 个元素的数组循环右移 n 位,要求时间复杂度为O(N)

    二、源代码

     1 package cn.com.zfc.day009;
     2 
     3 import java.util.Arrays;
     4 import java.util.Scanner;
     5 
     6 /**
     7  * 数组元素循环右移
     8  * 
     9  * @author zfc
    10  * @date 2017年11月3日 下午4:57:55
    11  */
    12 public class MoveArray {
    13     public static void main(String[] args) {
    14         Scanner scanner = new Scanner(System.in);
    15         System.out.println("请输入数组的长度:");
    16         int length = scanner.nextInt();
    17         int[] array = new int[length];
    18         System.out.println("请输入每个元素要右移的单位个数:");
    19         int n = scanner.nextInt();
    20         System.out.println("请输入 " + length + " 个整数:");
    21         for (int i = 0; i < length; i++) {
    22             array[i] = scanner.nextInt();
    23         }
    24         scanner.close();
    25         // 方法1
    26         System.out.println("---------------------方法1---------------------");
    27         moveArray1(array, n);
    28         // 方法2
    29         System.out.println("---------------------方法2---------------------");
    30         moveArray2(array, n);
    31         // 方法3
    32         System.out.println("---------------------方法3---------------------");
    33         moveArray3(array, n);
    34     }
    35 
    36     /**
    37      * 方法1:时间复杂度,O(length*n)
    38      * 
    39      * @param array:要移动的数组
    40      * @param n:每个元素要右移的单位个数
    41      */
    42     private static void moveArray1(int[] arr, int n) {
    43         int[] array = Arrays.copyOf(arr, arr.length);
    44         System.out.println("原数组:" + Arrays.toString(array));
    45         for (int i = n; i > 0; i--) {
    46             int t = array[array.length - 1];
    47             for (int j = array.length - 1; j > 0; j--) {
    48                 array[j] = array[j - 1];
    49             }
    50             array[0] = t;
    51         }
    52         System.out.println("右移后数组:" + Arrays.toString(array));
    53     }
    54 
    55     /**
    56      * 方法2:时间复杂度,O(n*n)
    57      * 
    58      * @param array:要移动的数组
    59      * @param n:每个元素要右移的单位个数
    60      */
    61     private static void moveArray2(int[] arr, int n) {
    62         int[] array = Arrays.copyOf(arr, arr.length);
    63         System.out.println("原数组:" + Arrays.toString(array));
    64         // 右移 n 与右移 n % length 是一样的效果
    65         n %= array.length;
    66         for (int i = n; i > 0; i--) {
    67             int t = array[array.length - 1];
    68             for (int j = array.length - 1; j > 0; j--) {
    69                 array[j] = array[j - 1];
    70             }
    71             array[0] = t;
    72         }
    73         System.out.println("右移后数组:" + Arrays.toString(array));
    74     }
    75 
    76     /**
    77      * 方法3:时间复杂度,O(n)
    78      * 
    79      * @param array:要移动的数组
    80      * @param n:每个元素要右移的单位个数
    81      */
    82     private static void moveArray3(int[] arr, int n) {
    83         int[] array = Arrays.copyOf(arr, arr.length);
    84         System.out.println("原数组:" + Arrays.toString(array));
    85         n %= array.length;
    86         reverse(array, 0, array.length - n - 1);
    87         reverse(array, array.length - n, array.length - 1);
    88         reverse(array, 0, array.length - 1);
    89         System.out.println("右移后数组:" + Arrays.toString(array));
    90     }
    91 
    92     private static void reverse(int[] arr, int x, int y) {
    93         for (; x < y; x++, y--) {
    94             int temp = arr[y];
    95             arr[y] = arr[x];
    96             arr[x] = temp;
    97         }
    98     }
    99 }

    三、运行效果

  • 相关阅读:
    nginx反向代理架构与安装配置(一)
    nginx反向代理部署与演示(二)
    php的opcode缓存原理
    php加速缓存器opcache,apc,xcache,eAccelerator
    php的高性能日志系统 seaslog 的安装与使用
    centos7下源码安装mysql5.7.16
    php 使用html5 XHR2 上传文件 进度显示
    php下ajax的文件切割上传
    php 输出缓冲 Output Control
    php单点登陆简单实现 (iframe方式)
  • 原文地址:https://www.cnblogs.com/zfc-java/p/7779325.html
Copyright © 2020-2023  润新知