32行代码AC——L1-027 出租 (20分)(~解题报告~)
立志用更少的代碼做更高效的表達
下面是新浪微博上曾經很火的一張圖:
一時間網上一片求救聲,急問這個怎么破。其實這段代碼很簡單,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容器做排序和去重, 但考慮到set容器不好操作(因為要用迭代器), 于是想到了桶排序去重的思路, 大概過程如下:
1、遍歷手機號, 定義數組a,將與手機號數字相同的數組值全部置1, 最后從大到小遍歷數組a, 若值為1,則將其下角標存入b,得到的b就是降序且去重的數組。
2、得到b數組后就簡單很多了,二重循環暴力判斷即可(手機號只有11位,無需化簡)。
代碼展示
#include<bits/stdc++.h> #define len 11 using namespace std;int a[10]; //若出現,則置1 int main() {string s; cin>>s;int sum = 0; //統計號碼中不同數字的個數 for(int i = 0; i < len; i++) a[(int)(s[i]-'0')] = 1; //這段代碼為b數組賦值 vector<int>b;int j = 0; for(int i = 9; i >= 0; i--) if(a[i] == 1) b.push_back(i); //為b數組賦值 int c[len]; //存放數字對應的位數 for(int i = 0; i < len; i++) {int k = ((int)(s[i]-'0'));for(int j = 0; j < b.size(); j++) {if(b[j] == k) c[i] = j; }}//輸出b數組 cout << "int[] arr = new int[]{";for(int i = 0; i < b.size(); i++) {if(i != 0) cout << ',';cout << b[i];}cout << "};" << '\n';//輸出c數組 cout << "int[] index = new int[]{";for(int i = 0; i < len; i++) {if(i != 0) cout << ',';cout << c[i];}cout << "};";return 0; }每日一句
忍耐不是美德,把忍耐當成美德是這個偽善的世界維持它扭曲的秩序的方式,生氣才是美德。——《房思琪的初戀樂園》
總結
以上是生活随笔為你收集整理的32行代码AC——L1-027 出租 (20分)(~解题报告~)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 4行代码AC——L1-026 I Lov
- 下一篇: (最优解)L1-028 判断素数 (10
