首先是暴力的解法
#include <iostream>
#include <vector>
using namespace std;
vector<int> arr;
vector<int> index;
int tag[12];
int main() {
string str;
cin >> str;
for (int i = 0; i < str.size(); i++)
tag[str[i] - '0'] = 1; //做标记,索引的思想
for (int i = 9; i >= 0; i--)
if (tag[i] == 1)
arr.push_back(i); //递减顺序
for (int i = 0; i < str.size(); i++)
for (int j = 0; j < arr.size(); j++)
if (str[i] - '0' == arr[j])
index.push_back(j);
//print arr
cout << "int[] arr = new int[]{";
for (int i = 0; i < arr.size(); i++)
if (i != arr.size() - 1)
cout << arr[i] << ",";
else
cout << arr[i];
cout << "};" << endl;
//print index
cout << "int[] index = new int[]{";
for (int i = 0; i < index.size(); i++)
if (i != index.size() - 1)
cout << index[i] << ",";
else
cout << index[i];
cout << "};" << endl;
return 0;
}
其次是用set和vector,较为优雅
arr数组中存放的为电话号码中出现的数字,降序且不重复
利用set性质为vector去重排序
index数组中的数据为电话号码的每位数字在arr中的下标。
#include <iostream>
using namespace std;
int main() {
string t;
cin >> t;
set<int, greater<int>> s; //set降序排序
vector<int> v, vindex;
for (int i = 0; i < t.length(); i++)
s.insert(t[i] - '0');
v.assign(s.begin(), s.end()); //将set中数据通过string类的方法assign()拷贝到vector中
//先输出arr数组
cout << "int[] arr = new int[]{"; //
cout << v[0];
for (int i = 1; i < v.size(); i++)
cout << "," << v[i];
cout << "};" << endl;
//输出index
for (int i = 0; i < t.length(); i++)
for (int j = 0; j < v.size(); j++)
if (v[j] == t[i] - '0')
vindex.push_back(j);
cout << "int[] index = new int[]{";
cout << vindex[0];
for (int i = 1; i < vindex.size(); i++)
cout << "," << vindex[i];
cout << "};" << endl;
}