小Q的排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32767041/article/details/86256275

Description

牛客网 2018校招真题 小Q的排序

操作一:将当前序列中前n-1个数排为升序
操作二:将当前序列中后n-1个数排为升序

Solving Ideas

aMin: 序列中的最小值
aMax: 序列中的最大值

分三种情况:

  • (1)aMin和aMax都在正确位置,即 aMin==a[0] && aMax==a[n]
  • (2)aMin和aMax都不在正确位置,即 aMin!=a[0] && aMax!=a[n]
  • (3)aMin和aMax只有一个在正确位置,即 aMin==a[0] || aMax==a[n]

res: 使整个序列变为升序所需要的最少操作次数

  • 对于第一种情况:如果原序列已是升序,则res=0,否则res=1
    如序列[1, 3, 4, 5, 2, 6],只需进行一次操作一或操作二即可;
    如序列[1, 2, 3, 4, 5, 6],则不需要进行任何操作。
  • 对于第二种情况:res=2
    如序列[4, 3, 1, 6, 2, 5],操作一和操作二各进行一次即可。
  • 对于第三种情况:res=1
    如序列[1, 3, 4, 6, 2, 5],进行一次操作二即可;
    如序列[4, 3, 1, 5, 2, 6],进行一次操作一即可。

Solution

import java.util.Scanner;

/**
 * aMin: 序列中的最小值
 * aMax: 序列中的最大值
 *
 * 分三种情况:
 * (1)aMin和aMax都在正确位置,即 aMin==a[0] && aMax==a[n]
 * (2)aMin和aMax都不在正确位置,即 aMin!=a[0] && aMax!=a[n]
 * (3)aMin和aMax只有一个在正确位置,即 aMin==a[0] || aMax==a[n]
 *
 * res: 使整个序列变为升序所需要的最少操作次数
 * 对于第一种情况:如果原序列已是升序,则res=0,否则res=1
 * 对于第二种情况:res=2
 * 对于第三种情况:res=1
 *
 * @author wylu
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            int[] a = new int[n];
            for (int i = 0; i < n; i++) {
                a[i] = scanner.nextInt();
            }

            int aMin = a[0], aMax = a[0];
            boolean isSorted = true;
            for (int i = 1; i < n; i++) {
                aMin = Math.min(aMin, a[i]);
                aMax = Math.max(aMax, a[i]);
                if (a[i - 1] > a[i]) isSorted = false;
            }
            int res = (aMin != a[0] && aMax != a[n - 1]) ? 2 : (isSorted ? 0 : 1);
            System.out.println(res);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_32767041/article/details/86256275