PTA 天梯赛 L1-027 出租 C++实现

下面是新浪微博上曾经很火的一张图:

一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1index[1]=0 对应 arr[0]=8index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100

本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。

输入格式:

输入在一行中给出一个由11位数字组成的手机号码。

输出格式:

为输入的号码生成代码的前两行,其中arr中的数字必须按递减顺序给出。

输入样例:

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};

解题思路:

① 利用 set 容器对输入的号码进行去重,set 容器中的数默认都是升序排序

② 将去重的号码进行降序排序,存入 arr 数组中;或者倒序存入 arr 数组中

③ 遍历每一个号码,将号码与 arr 数组中的数进行比对,对应下标存在 index 数组中

④ 按要求输出

代码示例:

#include <bits/stdc++.h>

using namespace std;

int main() {
	string phone; //号码
	cin >> phone;

	set<int> res; //对号码去重
	for (auto num : phone) {
		res.insert(num - '0');
	}

	vector<int> arr; //将去重后的数存入arr数组中
	for (auto p = res.begin(); p != res.end(); p++) {
		arr.emplace_back(*p);
	}
    
    //将arr数组降序排序
	sort(arr.begin(), arr.end(), greater<int>()); 
    
    //按要求输出
	cout << "int[] arr = new int[]{";
	for (int i = 0; i < arr.size(); i++) {
		if (i != 0) {
			cout << ",";
		}
		cout << arr[i];
	}
	cout << "};" << endl;

	vector<int> index;
	for (auto x : phone) {
		auto num = x - '0';
		for (int i = 0; i < arr.size(); i++) {
			if (num == arr[i]) {
				index.emplace_back(i);
			}
		}
	}

	cout << "int[] index = new int[]{";
	for (int i = 0; i < index.size(); i++) {
		if (i != 0) {
			cout << ",";
		}
		cout << index[i];
	}
	cout << "};" << endl;

	return 0;
}

运行结果:

猜你喜欢

转载自blog.csdn.net/m0_53209892/article/details/127955736