正序数组
正序数组
给定一个数组, 每次可以将其中一个元素放到最左边
请计算最少需要多少次 才能让新数组是递增排列的
输入:
第一行 整数N (2<N<20)
第二行 N个值不同的整数En (En<1000)
输出:
一个整数 表示让数组成为递增排列的最小操作次数
样例输入:
5
2 3 1 4 5
样例输出:
1
1 package com.work2021; 2 3 import java.util.Arrays; 4 import java.util.Scanner; 5 6 /** 7 * @ClassName: Assignment_28_1 8 * @Description: one new test 9 * @author: Yu wang 10 * @date: Created in 2021/3/3 11:08 11 */ 12 public class Assignment_28_1 { 13 static public Scanner sc = new Scanner(System.in); 14 static public color color = new color(); 15 public static void main(String[] args) { 16 do { 17 new Assignment_28_1().work(); 18 System.out.println(color.color1() + "\n继续输入0,退出输入1"); //循环判断 19 } while (sc.nextInt() != 1); 20 } 21 public void work() { 22 System.out.println(color.color1() + "输入数字个数:"); 23 int N = sc.nextInt(); 24 //限定N的范围 25 if (2 < N && N < 20) { 26 //定义存数字的数组 27 int[] En = new int[N]; 28 //存储目标序列 29 int[] newarr = new int[N]; 30 System.out.println(color.color1() + "输入每个数字:"); 31 for (int i = 0; i < En.length; i++) { 32 En[i] = sc.nextInt(); 33 //限定En的范围 34 if (En[i] >= 1000) { 35 System.out.println(color.color1() + "En>=1000,重新输入该En:"); 36 En[i] = sc.nextInt(); 37 } 38 newarr[i] = En[i]; 39 } 40 //设定目标排序 41 Arrays.sort(newarr); 42 int now = N-1; 43 //倒序对比,若相等控制排序数组指针前移,now--是不需要改变的位置 44 for (int i = N-1; i >= 0; i--) { 45 if (En[i] == newarr[now]) { 46 now--; 47 } 48 } 49 System.out.println(color.color1() + "让数组成为递增排列的最小操作次数" + color.color2() + (now+1)); 50 }else { 51 System.out.println(color.color2()+"请重新输入N"); 52 } 53 } 54 }
某大佬的写法
package com.work2021; import java.util.Arrays; import java.util.Scanner; import java.util.TreeMap; public class Assignment_28 { /** * 给定一个数组, 每次可以将其中一个元素放到最左边 * 请计算最少需要多少次 才能让新数组是递增排列的 * 输入: * 第一行 整数N (2<N<20) * 第二行 N个值不同的整数En (En<1000) * 输出: * 一个整数 表示让数组成为递增排列的最小操作次数 */ public static void main(String[] args) { Scanner input = new Scanner(System.in); loop:while (true) {//无限循环(外) System.out.print("输入序列长度N(正整数,若-1则退出):"); int n = 0; while (true) {//无限循环(内) if (input.hasNextInt()) { n = input.nextInt(); if(n == -1) {//若n == -1,退出外循环,程序结束 break loop; } }else { input.next();//接收非Int值 } if (n > 2 && n < 20) {//n符合要求,退出内循环 break; }else { System.out.print("错误!请重新输入一个正整数:"); } } int[] arr = new int[n]; System.out.printf("输入%d个整数:",n); for (int i = 0; i < arr.length; i++) {//循环给序列赋值 if (input.hasNextInt()) { arr[i] = input.nextInt(); } } System.out.println("最小操作次数为:" + getCount(arr)); System.out.println(); } input.close(); System.out.println("程序结束!"); } /** * 获得操作次数 */ public static int getCount(int[] arr) { TreeMap<Integer, Integer> map = new TreeMap<>();//Map集合 int count = 0; //操作次数 int newkey = -1; //序列元素放到最左边后,对应的新key int temp; //临时变量,暂存要移除的移到最左边的元素 for (int i = 0; i < arr.length; i++) { map.put(i, arr[i]);//将序列元素与key一一建立映射关系(按元素在原序列中的位置,key从0到len - 1) } System.out.println("原序列:"); show(map); //显示原序列 Arrays.sort(arr); //将序列排序 System.out.println("开始操作:"); for (int i = arr.length - 1; i > 0; i--) {//将序列按值从大到小遍历 if (getKey(map, arr[i]) < getKey(map, arr[i - 1])) {//若当前元素对应的key比前一个元素对应的key小 temp = map.remove(getKey(map, arr[i - 1])); //移除当前映射(按原序列中的位置映射) map.put(newkey--, temp);//建立新的映射关系(正序按值大小的映射) count++;//此时序列的排序早已完成,上述是调整映射关系,复现操作序列元素的过程,操作次数++ show(map);//打印按位置映射的序列 } } return count; } /** * 根据value获取key */ public static int getKey(TreeMap<Integer,Integer> map,int value) { int key = 0; for (int i : map.keySet()) {//遍历map集合 if (map.get(i).equals(value)) {//找到与value对应的key并返回 key = i; } } return key; } /** * 显示map集合 */ public static void show(TreeMap<Integer, Integer> map) { for (int i : map.keySet()) { System.out.printf(" %2d ",map.get(i)); } System.out.println(); } }

浙公网安备 33010602011771号