OJ解码编码题

OJ解码题

题目

设有一个整型数组a中存放n个互不相同的整数,a中元素取值范围为0到n-1。a数组的编码定义如下:a[0]的编码为0,放入b[0];ai的编码为在a[0]、a[1]、…、a[i-1]中比a[i]的值小的数的个数,放入b[i]。例如:a[6]={4,3,0,5,1,2}时,则b[6]={0,0,0,3,1,2}。你有两个任务,任务一是编码,即已知n与数组a,求数组b;任务二是解码,即已知n与数组b,求数组a。
输入与输出要求:首先输入两个整数n和flag。n代表数组元素的个数(1<=n<=100),flag代表任务类型(flag=1代表编码任务,flag=2代表解码任务)。然后是n个整数,当flag=1时,这n个数即代表数组a的内容;当flag=2时,这n个数即代表数组b的内容。
输出n个整数,当flag=1时即为编码后数组b的内容,当flag=2时,即为解码后数组a的内容。每个整数用空格分开,最后一个整数后是换行符。
程序运行效果:
Sample 1:
5↙
1↙
2 1 3 0 4↙
0 0 2 0 4
Sample 2:
8↙
2↙
0 1 2 0 1 1 4 5↙
3 6 7 0 2 1 4 5

代码

#include <stdio.h>

int main()
{
   int n,flag,A[110],B[110],C[110];
   scanf("%d%d",&n,&flag);
   for(int i=0;i<n;i++)
    {
        scanf("%d",&A[i]);
    }
    for(int i=0;i<n;i++)
    {
        C[i]=i;
    }
   if(flag==1)
   {
       B[0]=0;
       for(int i=1;i<n;i++)
       {
           int cnt=0;
           for(int j=0;j<i;j++)
           {
               if(A[i]>A[j])
               {
                   cnt++;
               }
               B[i]=cnt;
           }
       }
   }

   else if(flag==2)
   {


       for(int i=n-1;i>-1;i--)
       {
          B[i]=C[A[i]];
          for(int k=A[i]+1;k<n;k++)
          {
              C[k-1]=C[k];
          }

       }
   }

   for(int i=0;i<n;i++)
   {
        printf("%d ",B[i]);
   }
    return 0;
}

心得

1.解码

(1)题目中的数字的范围是关键 n个互不相同的整数,a中元素取值范围为0到n-1
(2)遇到难解的问题时,可以倒过来看,比如A{0 1 2 0 1 1 4 5},拿最后一个数字来 看,5,之前有5个比她小的,那她一定是5
(3)于是产生一个想法,生成一个自然的序列,B从0~n-1;A的最后一个是5,就对应B的第六个,然后5用过了,把B中的5删去,同时利用使数组前移,于是循环进行此类操作。
(4)总结 ,A从后往前读的意义就是就是读出的是B中的顺序

2.编码

简单明了,不再解释

猜你喜欢

转载自blog.csdn.net/weixin_43999803/article/details/84996066