算法——线性代数——逆序数奇偶

一、逆序数奇偶 

 

分析:

  •  概念:
    • 求一个排列的逆序数奇偶性有两种方法,一种是从前往后遍历数组,另一种是从后往前遍历数组
    • 从前往后时,当前数字前面大于它的数字的个数即为它的逆序数个数
    • 从后往前时,当前数字前面小于它的数字的个数即为它的逆序数个数
    • 把排列所有数字的逆序数个数相加,即为当前排列的逆序数个数,如果该数为偶数,则为偶性,为奇数,则为奇性
  • 该题要点:
    • 就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++;
        }
	 }
}

 

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戏拈秃笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值