上圖轉自新浪微博:“阿里代碼庫有幾億行代碼,但其中有很多功能重復的代碼,比如單單快排就被重寫了幾百遍。請設計一個程序,能夠將代碼庫中所有功能重復的代碼找出。各位大佬有啥想法,我當時就懵了,然后就掛了。。。”
這里我們把問題簡化一下:首先假設兩個功能模塊如果接受同樣的輸入,總是給出同樣的輸出,則它們就是功能重復的;其次我們把每個模塊的輸出都簡化為一個整數(在?int?范圍內)。于是我們可以設計一系列輸入,檢查所有功能模塊的對應輸出,從而查出功能重復的代碼。你的任務就是設計并實現這個簡化問題的解決方案。
輸入格式:
輸入在第一行中給出 2 個正整數,依次為?N(≤104)和?M(≤102),對應功能模塊的個數和系列測試輸入的個數。
隨后?N?行,每行給出一個功能模塊的?M?個對應輸出,數字間以空格分隔。
輸出格式:
首先在第一行輸出不同功能的個數?K。隨后?K?行,每行給出具有這個功能的模塊的個數,以及這個功能的對應輸出。數字間以 1 個空格分隔,行首尾不得有多余空格。輸出首先按模塊個數非遞增順序,如果有并列,則按輸出序列的遞增序給出。
注:所謂數列 {?A1?, ...,?AM??} 比 {?B1?, ...,?BM??} 大,是指存在?1≤i<M,使得?A1?=B1?,...,Ai?=Bi??成立,且?Ai+1?>Bi+1?。
輸入樣例:
7 3
35 28 74
-1 -1 22
28 74 35
-1 -1 22
11 66 0
35 28 74
35 28 74
輸出樣例:
4
3 35 28 74
2 -1 -1 22
1 11 66 0
1 28 74 35
代碼長度限制
16 KB
Java (javac)
時間限制
1500 ms
內存限制
128 MB
Python (python3)
時間限制
1500 ms
內存限制
64 MB
其他編譯器
時間限制
500 ms
內存限制
64 MB
棧限制
8192 KB
想法:
想用map映射。就是把輸入的每一行當作一個string,然后用st數組記錄不同的string出現的個數,然后排個序并按題目輸出。結果有兩個點過不去。
代碼:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int st[10010]={0};
string s1[10010],s2[10010];
map<string,int>mp;
int cnt=1;
bool cmp(string a,string b){
? ? if(st[mp[a]]==st[mp[b]]) return a<b;
? ? return st[mp[a]]>st[mp[b]];
}
int main(){
? ? cin>>n>>m;
? ? getchar();
? ? for(int i=0;i<n;i++){
? ? ? ? getline(cin,s1[i]);
? ? ? ? if(mp[s1[i]]==0) {mp[s1[i]]=cnt;s2[cnt]=s1[i];cnt++;}
? ? ? ? st[mp[s1[i]]]++;
? ? }
? ? cout<<cnt-1<<endl;
? ? sort(s2+1,s2+cnt,cmp);
? ? for(int i=1;i<cnt;i++){
? ? ? ? cout<<st[mp[s2[i]]]<<' '<<s2[i]<<endl;
? ? }
? ? return 0;
}
然后我發現確實是有些例子是錯的。
例如這個例子
輸出的是這個,負數的情況有些就不行。
但是吧,我想著弄成m維數組,又不知如何分辨出不同的輸入模塊。不知用set行不行。