PTA:L1-027 出租——利用map标记法(简单且代码简短)

文章介绍了一个C++程序,该程序接收一个电话号码字符串,找出所有不同的数字并按降序排列,存储在arr数组中。同时,程序使用一个映射(map)结构ma来记录数字与其在arr中的下标关系,然后根据这个映射生成index数组,输出电话号码中每个数字对应的arr下标。程序处理了输出格式的要求。
摘要由CSDN通过智能技术生成

由于题为一张图片,所以不复制原题了。我简短复述一下题目意思。

主要还是笔记作用,感觉这种map使用方法以后可能有用

题目:

给你一个电话号码S;

现在要求你输出一个arr数组

对arr数组的定义是:电话号码中出现的数字,并按从大到小排列

接下来利用arr数组中数字的下标对电话号码中的每个数字进行替换(不改变顺序)

现在将上述输出的称为index数组。

题目要求我们输出arr数组和index数组

看个样例:

输入:

18013820100

输出:

int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};
 

首先电话中出现了01238这几个数字,将他倒序输出作为arr数组

再利用arr数组的下标替换原电话中的数字作为index数组输出

如第一个数字1,他在arr中下标为3,所以输出3

第二个数字8,在arr中下标为0,所以输出0

后面同理。

OK,题目意思很好理解,直接代码c++

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<map>//头文件

using namespace std;

typedef long long llint;
const int N=1e3;

map<char,int> ma;//开一个map,ma,用于映射数字和下标的关系
int cnt[N];//用来记录哪些数字出现过

int main(){
	string s;
	cin >> s;
	for(int i=0;i<s.length();i++){//遍历电话号码
		cnt[s[i]-'0']=1;//对出现过的数字标记为1
	}
	int idx=0;//记录每个数字在arr中下标
	int flag=0;//用来卡输出格式的
	cout << "int[] arr = new int[]{";//输出
	for(int i=9;i>=0;i--){
		if(cnt[i]){
			if(!flag){
				cout << i;//用于满足输出格式
				flag=1;
			}
			else{
				cout << "," << i;//满足输出格式
			}
			ma[i+'0']=idx++;//由于是倒着遍历的,所以第一个数字的下标就是0,此后idx自加
                            //就利用map将数字于arr中的下标映射起来了
		}
	}
	cout << "};" << endl << "int[] index = new int[]{";//输出
	flag=0;//用于卡输出格式
//此时再次遍历s,由于我们已经将每个数字于arr的下标映射了,所以直接查询数字的映射值输出即可
	for(int i=0;i<s.length();i++){
		if(!flag){
			cout << ma[s[i]];
			flag=1;
			continue;
		}
		cout << "," << ma[s[i]];
	}
	cout << "};";
//最后注意输出的格式
	return 0;
} 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值