思路:
首先把字符串用set过滤一下,顺便排个序。
然后我们希望构建一个下标和值相互映射的关系,然鹅由于set不能用下标访问(只能迭代器),所以可以将元素都存到数组vector里面(这时候用容器的拷贝就非常方便了,直接把set的元素复制粘贴到vector)。
然后把vector扩容再赋值为-1,目的是维护ve1数组能正常赋值。因为ve1和ve建立对应关系时候空间大小要保持一致
最后输出。
貌似用两个map的思路也可以?
#include <bits/stdc++.h>
using namespace std;
set<int,greater<int>> s;//递减
int main(){
string str;
cin>>str;
for(int i=0;i<str.size();i++){
s.insert(str[i]-'0');//记得字符串转化为整型
}
vector<int> ve(s.begin(),s.end());//直接复制,解决了set没有下标不好访问的问题
int a = ve.size();//记录未添加-1时的size,用于后面逗号的输出格式
for(int i=ve.size();i<=ve[0];i++){//添加-1
ve.push_back(-1);
}
map<int,int> ve1;//ve与ve1相互映射
for(int i=0;i<=ve[0];i++)//遍历长度到ve中最大的那个值
{
ve1[ve[i]]=i;
}
cout<<"int[] arr = new int[]{";
for(int i =0;i<ve.size();i++){
if(ve[i]!=-1&&i!=a-1) cout<<ve[i]<<',';
else if(ve[i]!=-1&&i==a-1) cout<<ve[i];//用a记录没插入-1之前的ve长度
}
cout<<"};"<<endl;
cout<<"int[] index = new int[]{";
for(int i=0;i<str.size();i++){
if(i!=str.size()-1)cout<<ve1[str[i]-'0']<<',';
else cout<<ve1[str[i]-'0'];
}
cout<<"};";
return 0;
}