数组元素循环右移问题

数组元素循环右移问题

一、问题描述

  把一个含有 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 }

三、运行效果

原文地址:https://www.cnblogs.com/zfc-java/p/7779325.html