由于题为一张图片,所以不复制原题了。我简短复述一下题目意思。
主要还是笔记作用,感觉这种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;
}