1. 程式人生 > >藍橋杯_演算法訓練_字串統計

藍橋杯_演算法訓練_字串統計

其實題目已經給的很清楚了,列舉所有的情況,統計出現次數,找到符合條件的結果。

那麼我們就根據這個提示完成即可:

第一步:列舉所有可能的字串:

 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