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


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

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

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

 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM