一、逆序数奇偶
分析:
- 概念:
- 求一个排列的逆序数奇偶性有两种方法,一种是从前往后遍历数组,另一种是从后往前遍历数组
- 从前往后时,当前数字前面大于它的数字的个数即为它的逆序数个数
- 从后往前时,当前数字前面小于它的数字的个数即为它的逆序数个数
- 把排列所有数字的逆序数个数相加,即为当前排列的逆序数个数,如果该数为偶数,则为偶性,为奇数,则为奇性
- 该题要点:
- 就java而言,如果使用Scanner类接收输入,可能会超时,处理大量数据时,应该使用BufferedReader类
- 一次会输入多个案例,连续接收这些案例,怎么分辨 n 和排列数字也很重要,注意 n 可能为1
package no1_1;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
String string;
int n=0;
int inputTurn=1;//分辨输入的是n还是数组
while ((string = reader.readLine())!=null) {
long count=0;//逆序数计数器
String[] s = string.split(" ");
if(inputTurn%2==1) {//输入行数为奇数的就是n
n = Integer.parseInt(s[0]);
}else {
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(s[i]);
// 从数组前端开始遍历,当前数字前面的数字里大于它的数字的个数,即为当前数字的逆序数个数,
//整个数组所有数字的逆序数相加即为当前排列的逆序数
for(int j=0;j<i;j++) {
if(arr[j]>arr[i]) {
count++;
}
}
}
System.out.println(count % 2 == 0 ? "even" : "odd");
}
inputTurn++;
}
}
}