天梯赛L1-027 出租
一、问题描述
下面是新浪微博上曾经很火的一张图:
一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index
数组就是arr
数组的下标,index[0]=2
对应 arr[2]=1
,index[1]=0
对应 arr[0]=8
,index[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};
二、设计思路
(1)输入一个完整的电话号码;
(2)将电话号码的每个数字读取出来并放到一个数组a中;
(3)利用set容器可以对元素自动排序并且不会重复插入相同元素的属性,统计出来电话号码中出现的每个数字;
(4)根据题目,需要得到电话号码中每个数字在数组a中的下角标;
(5)利用for循环遍历电话号码,得到每个数字在数组a中的下角标,并将其存放在数组b中,方便后续的输出;
(6)最后根据题目要求按照一定的格式输出数组a和数组b中的元素,完成题目要求;
三、程序流程图
四、伪代码实现
五、代码实现
1 #include<iostream> 2 using namespace std; 3 #include <algorithm> 4 #include<set> 5 int main() 6 { 7 set<int,greater<int>>s1; 8 string s; 9 cin >> s; 10 for (int i = 0; i < s.length(); i++) 11 { 12 s1.insert(s[i] - '0'); //得到电话号码中的每个数并用set容器进行排序和删除重复数据 13 } 14 cout << "int[] arr = new int[]{"; 15 int a[11] = { 0 }; 16 int i = 0; 17 for (set<int>::iterator it = s1.begin(); it != s1.end(); ++it) 18 { 19 a[i] = (*it); 20 i++; //将set容器中的数据放到数组中,方便后面的结果输出 21 } 22 int b[11] = { 0 }; 23 int l = 0; 24 for (int m = 0; m < 11; m++) 25 { 26 for (int k = 0; k < 11; k++) 27 { 28 if (a[k] == (s[m] - '0')) 29 { 30 b[l] = k; //遍历a数组,找出电话号码每个数在a数组中对应的下标,并将其存放在b数组中,方便以后的输出 31 l++; 32 break; //注意 不加break会崩溃!!! 33 } 34 } 35 } 36 for (int i = 0; i < s1.size()-1; i++) 37 { 38 cout << a[i] << ","; 39 } 40 cout << a[s1.size() - 1] << "};" << endl; //按题目要求输出相应结果 41 cout << "int[] index = new int[]{"; 42 for (int j = 0; j < 10; j++) 43 { 44 cout << b[j] << ","; 45 } 46 cout << b[10] << "};" << endl; 47 return 0; 48 }
六、总结
(1)set容器会对插入的元素进行自动排序,默认是从小到大的排序;
(2)如果想改变默认排序,变为从大到小的排序方式,可以通过set<int,greater<int>>来实现;
(3)set容器不允许插入相同的元素,multiset容器允许插入相同的元素;