藍橋杯_演算法訓練_字串統計
阿新 • • 發佈:2019-02-03
其實題目已經給的很清楚了,列舉所有的情況,統計出現次數,找到符合條件的結果。
那麼我們就根據這個提示完成即可:
第一步:列舉所有可能的字串:
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 int main() 5 { 6 int n; 7 char s[61]; //存放原來的字串 8 char a[61][61]; //存放所有可能的字串 9 int i=0,j=0,r=0; 10 11 cin>>n;12 cin>>s;//輸入原來的字串 13 14 while(1) 15 { 16 while(j<n) //n個一賦值 17 { 18 a[i][j] = s[r]; 19 j++; 20 r++; 21 } 22 a[i][j] = '\0';//問題所在處 23 if(i==strlen(s)-n && j==n) break;//當記錄到最後一個字元的時候,說明記錄已完畢24 j = 0; 25 r = r - n + 1; 26 i++; 27 }
這裡面最初我是出現了一點小問題的:也就是上面程式碼中我註釋的那個“問題所在處”。沒有給每個字串後面加‘\0’,這就相當於沒有終止該字串。當時除錯程式的時候是有問題的。給大家看一個例子:
我當時設定了兩個地方的輸出,然後程式給我的迴應就是上面的東西,表示很鬱悶啊。還好發現了錯誤並且進行了改正。
程式碼不需要額外解釋,註釋還是比較詳細的。
第二步:統計出現次數
1 /*統計個數*/ 2 int num[61] = {0}; 3 char temp = '0'; 4 for(j = 0; j <= i; j++) 5 { 6 for(r = j+1; r <= i; r++) 7 { 8 if(strcmp(a[j],a[r])==0) 9 { 10 num[j]++; 11 a[r][0] = temp;//給首位賦一個數字,使其絕對不會成為最大次數的競爭對手 12 temp = temp+1; 13 } 14 } 15 }
我的想法是:之前已經枚舉了所有的情況,那就統計一下對應的出現次數,一遍一遍的刷,但是在刷的過程中,要注意的是,需要將重複的字串計數之後進行一下處理,我的做法是,將字串的首位變成數字,這樣就可以保證至少自己人不會和自己人槓上,也就是說同一個字串不會搶奪第一的位置。
這裡面需要說明的是程式碼第11和12行:起初設定的時候,我將首位直接設定成了‘0’,但是發現可能會出現首字母為‘0’的字串才是最多的,因為很多字串可能就是首字母不同,如果我全部設定成‘0’,那就給了他們相同的機會,所以我做了改動,讓臨時變數temp隨著統計發生變化,本來想用隨機數什麼的,但是這裡因為是字元的處理,隨機數可能還是有些麻煩的。
第三步:找到最終結果:
我們需要的是出現次數最多的字串,如果有相同次數的,選擇最長的字串,如果還是很多個,選擇最早的那個,這個還是比較好控制的。
1 /*進行數字的比較,確定出現次數最多的那個*/ 2 int max = 0;//記錄下標的變數 3 for(r = 1; r <= i; r++) 4 { 5 if(num[max]<num[r]) 6 { 7 max = r; 8 } 9 else if(num[max]==num[r])//出現次數一樣多 ,找最長的那個 10 { 11 if(strlen(a[max]) < strlen(a[r])) 12 { 13 max = r; 14 } 15 } 16 } 17 //此時max就是我們尋找的那個下標 18 cout<<a[max];
不到之處還希望大家批評指正,在此謝過!20:06:39 2017-08-13