大家好!我叫Jj_ss,這是我的第一篇博客,在這里呢我給大家分享一個演算法,
這個演算法題從分析到代碼實作再到最后的測驗都沒有借鑒任何東西,所以在效率上可能不是很優化,但是應該是很容易理解的,我水平不高菜雞一個,以后隨著能力的增長我相信我的演算法質量應該會有相應的提升,大佬就不要看了,不然又要被笑話了,

當時拿到這個題目的時候呢,思路是很清晰的,就是拿第一個數依次和后面的進行比較,當兩個數相等的時候將后面的數前移覆寫掉重復的,通過演算很快我就用代碼實作了這個程序,
void vs(int *p,int &n){
int i,j,k;
for(i=0;i<n-1;i++) //這里的n必須減一,否則 最后會有一次自己與自己比較,導致表長減一
for(j=i+1;j<n;j++) //使用第一個數依次和后面的數進行比較
if(p[i]==p[j])
{
for(k=j;k<n;k++){
p[k]=p[k+1]; //如果兩個數相等,則把后面的數前移覆寫掉前面的數
}n--; //陣列長度減一
}
}
當時在測驗的程序中我發現如果輸入的資料中是帶有重復的元素輸出正確,而不帶有重復的元素少輸出了一個數,經過檢查發現外層回圈的n必須是減一的,否則不論有沒有重復的元素,最后一步會是自己和自己進行比較,這樣就會導致表長n多減去一個一,輸出的時候自然會少輸出一個值,
之后去用平臺進行檢測時發現總是出現錯誤,經過詢問才知道輸出格式必須與平臺的輸出格式一摸一樣,否則通過不了,于是我開始想辦法去格式化列印,

上面的輸入是一次性輸入,下面的輸出也是一次性的,這可把我難到了,最開始想到的辦法是用一個變數對每一行進行去重完畢的陣列長度進行統計,然后用這個變數去限制列印條件,后來測驗之后才發現這個想法很天真,因為每次對每一行的資料進行去重之后會覆寫掉上一行的資料,這樣就導致最后輸出的時候只會輸出最后一行的資料了,
int main(){
int n,m,i,j,g,f=0,a;
int s[30][10001];
int p[10001];
cin>>n; //輸入行數
for(i=0;i<n;i++){
cin>>m; //輸入每行的個數
for(j=0;j<m;j++){
cin>>p[j]; //輸入每行的資料
}
vs(p,m); //呼叫方法對輸入的P陣列進行去重
g=0;
for(a=0;a<m;a++){
s[f][g++]=p[a]; //使用一個二維陣列S對每次去重的P陣列進行記錄,方便后面列印輸出
}
f++;
}
for(i=0;i<n;i++){
for(j=0;s[i][j]!=0;j++){
cout<<s[i][j]<<" "; //列印二維陣列S
} cout<<endl;}
}
之后我想到了用一個二維陣列去記錄每行和每列經過去重之后的資料,最后列印這個二維陣列就可以了,

這是輸入的格式,在這里提示一下使用鍵盤輸入數字的時候可以使用空格或回車進行隔開,

這是輸出的格式,可以說和題目要求一摸一樣了,我很高興,但是頭痛的是那個平臺依舊不讓我通過,我自己測驗了很多種情況,每次都是成功的,最后我只能怪我寫的演算法太爛,平臺看不上吧

第一次認真的去做一個演算法題,可能質量上不是很過關,但我也很開心,畢竟從頭到尾都是自己獨立思考完成的,在有些人眼里或許不值一提,但對于我來說是一個很不錯的開始,當我測驗成功的那一刻的成就感令我深深的喜歡上了這種感覺,我也會一直的走下去,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/195278.html
標籤:其他
