编码问题 【NOIP 1995 提高组】(JAVA)

编码问题 【NOIP 1995 提高组】(JAVA)

题目描述

编码问题:设有一个数组A:ARRAY[0…N-1] OF INTEGER;数组中存放的元素为0~N-1之间的整数,且A[i]≠A[j](当i≠j时)。

例如:N=6时,有: A=(4,3,0,5,1,2)

此时,数组A的编码定义如下:

A[0]的编码为0;

A[i]的编码为:在A[0],A[1],……A[i-1]中比A[i]的值小的个数(i=1,2……N-1)

∴上面数组A的编码为: B=(0,0,0,3,1,2)
程序要求解决以下问题:

① 给出数组A后,求出其编码;

② 给出数组A的编码后,求出A中的原数据。

输入

第一行是一个字母A或者B,分别表示给出的是A数组或者是B数组的值

第二行给出的是N

第三行给出的是数组A或者B的元素的值

输出

输出一行整数,整数之间用空格分开

样例输入
A
6
4 3 0 5 1 2

样例输出
0 0 0 3 1 2

思路:
由A推出B很简单,就不用说了,直接两重循环。
B推A的话:刚开始也是没有思路,后面经过几次举例,发现了方法,以上面的B = {0 0 0 3 1 2}为例

创一个数组P,依次赋值 { 0 1 2 3 4 5 };

从B的后面开始,取P数组里面索引为 2 的数,就是 2
所以B数组最后一位对应的数为 2
再把P数组里面的2删去,P = { 0 1 3 4 5 };
接着看倒数第二个 取P数组里面索引为 1 的数,就是 1 ,删去P中对应的数,P = { 0 3 4 5 };
再取P数组里面索引为 3 的数,就是 5 ,P = { 0 3 4 };
取P数组里面索引为 0 的数,就是 0 ,P = { 3 4 };
取P数组里面索引为 0 的数,就是 3 ,P = { 4 };
最后一个 就是 4啦。
所以我想到了用ArrayList集合来实现,它的get方法可以得到给出索引的值
remove方法可以删除给出索引的值。。刚好是我想要的。

代码如下:

import java.util.*;
public class text {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String a=sc.next();

        int b=sc.nextInt();

        int p[]=new int[b];
        int last[]=new int[b];//用于放值

        for(int i=0;i<b;i++){
            p[i]=sc.nextInt();
        }
		//判断需要进行的方法
        if(a.equals("A")){
            findB(p, last);
        }else if(a.equals("B")){
            findA(p,last);
        }
		//打印结果
        for(int i:last){
            System.out.print(i+" ");
        }

        
}
public static void findB(int p[],int last[]){
    int count;last[0]=0;

    for(int i=1;i<p.length;i++){
        count=0;
        for(int j=0;j<i;j++){
            if(p[j]<p[i]){
                count++;
            }
        }
        last[i]=count;
    }
}
public static void findA(int p[],int last[]){
    ArrayList<Integer> s = new ArrayList<>();//新建集合

    for(int i=0;i<p.length;i++){
         s.add(i);//初始化
    }

    for(int i=p.length-1;i>=0;i--){
        last[i]=s.get(p[i]);//得到对应索引的值并赋值;
        s.remove(p[i]);//删除对应索引的值;
    }

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值