编码问题

 

设有一个数组 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中的原数据。

 

#include<bits/stdc++.h>//不要用万能头!!! 
using namespace std;
int num;
int main(){
	int a[19999];//大数组尽量定义到主函数外; 
	int n;
	char ab;//记录第一个字符 
	string zry;
	cin>>n;
	cin>>zry;//输入一串字符 
	ab=zry[0];//问题1还是2,看第一个字符是A还是B 
	for(int i=0;i<zry.size();i++){
		if(zry[i]>='0'&&zry[i]<='9'){//判断这个字符是不是数字 
			
			a[num]=zry[i]-48;//是,就存起来 
		
			num++;// 
		}
	}//这串代码就是提取字符串中的数字 
	
	if(ab=='A'){//问题一 
		int x=0;//记比a【i】小的数 
		int b[1000];
		for(int i=0;i<n;i++){
			b[i]=a[i];
		}//存原数组,因为判断数组a的编码后,后面的数也要判断 
		a[0]=0;//第一个数前肯定没有比它小,所以为0 
		for(int i=1;i<n;i++){
			for(int j=0;j<i;j++){
				if(b[j]<a[i]){
					x++;
				}
			}
			a[i]=x;
			x=0;//要初始化 
		}//其实这里用倒序更简单,因为不会影响到下一步判断,这串代码不好 
		 
		cout<<"B=(";//问题一,二输出的不一样 
	}//对着规律推 
	if(ab=='B'){//问题二 
		int c[1000];
		int b[1000];
		for(int i=n-1;i>=0;i--){
			b[i]=i;//记录 
			
		}
		
		for(int i=n-1;i>=0;i--){//要从后面算,不然麻烦!!! 
			
			c[i]=b[a[i]];//因为是前面比自己小的数,又没重复,所以直接求数 
			b[a[i]]=100000;
			sort(b,b+n);//去除b[a[i]] ,最好用vector 
		}
		for(int i=0;i<n;i++){
			a[i]=c[i]; 
		}//最后赋给数组a 
		cout<<"A=(";
	}//这题要倒推编码规律 
	for(int i=0;i<n-1;i++){
		cout<<a[i]<<',';//要注意最后一个数没有“,” 
	}
	cout<<a[n-1]<<")";
	return 0;
} 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值