版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}
}
}