题目链接 https://pintia.cn/problem-sets/994805046380707840/problems/994805107638517760
下面是新浪微博上曾经很火的一张图:
一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,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};
思路 看数据可以用set存储,即排好了序列还去重,之后在模拟即可
注意 strlen() 计算一个字符串(字符数组)中元素的个数,即从数组头部计数,直到遇到字符串结束符\0为止,计数结果不包括\0.
s[0]='\0'等价s[0]=0.
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<set>
#include<algorithm>
using namespace std;
int main()
{
set<int> s;
char s1[100];
int key;
scanf("%s",s1);
for(int i=0;i<strlen(s1);i++){
s.insert(s1[i]-'0');//输入数据
}
int w=strlen(s1);
set<int>::iterator it; //迭代器
for(int i=0;i<w;i++){
key=0; //设置位置标记
for(it=s.end();it!=s.begin();){ //不断的查找位置
if((s1[i]-'0')==*(--it)){
s1[i]=key; //记录位置到s1中
break;
}
key++;
}
}
cout<<"int[] arr = new int[]{"; //输出
it=s.end();
for(it--;it!=s.begin();it--)
cout<<*it<<",";
it=s.begin();
cout<<*it<<"};"<<endl;
cout<<"int[] index = new int[]{";
for(int i=0;i<w-1;i++)
printf("%d,",s1[i]);
printf("%d};\n",s1[w-1]);
return 0;
}