数组元素循环右移问题
一、问题描述
把一个含有 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 }
三、运行效果