Title

正序数组

正序数组

给定一个数组, 每次可以将其中一个元素放到最左边

请计算最少需要多少次 才能让新数组是递增排列的

 

输入:

第一行 整数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();
    }
}

 

posted @ 2021-03-03 15:36  WAASSTT  阅读(240)  评论(0)    收藏  举报
Title