编码问题 【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]);//删除对应索引的值;
}
}
}