天天看點

課堂練習-找水王

一、題目及題目要求

題目:三人行設計了一個灌水論壇。資訊學院的學生都喜歡在上面交流灌水,傳說在論壇上有一個“水王”,他不但喜歡發帖,還會回複其他ID發的每個文章。坊間風聞該“水王”發帖數目超過了文章數目的一半。

如果你有一張目前論壇的文章(包括回帖)清單,其中文章的作者的ID也在其中,你能快速的找到這個傳說中的水王嗎?

二、設計思路:

1、把文章清單,抽象為一個一維數組arr[NUM],輸入長度length為id總數,每個數組元素為一個id。

2、再設定一個循環,按照順序來依次兩兩比較,如果作者id相同則保留,如果作者id不同則消除。

3、最後剩下id即為水王id

三、源程式:

#include<iostream>
using namespace std;
#define NUM 100
 int find(int arr[], int n)//找水王函數
 {
    int sw = 0; //
    int count=0;  //标記
    for(int i=0;i<n;i++)
    { 
        if(count == 0)//初始時,把數組第一個元素賦給sw
        { 
            sw = arr[i]; 
            count = 1; 
        } 
        else
        { 
            if(sw == arr[i]) //相等不消除
                count ++; 
            else  
                count --; 
        } 
    }

         return sw;
    }
int main()
{
	  int length=0;
      while (length==NULL||length == 0)//如果數組長度為空或零則請重新輸入
      {
        cout<<"請輸入ID數量:";
        cin>>length;
       }
       int arr[NUM];
       cout<<"輸入作者id(不為0):"<<endl;
	   for(int i=0;i<=(length-1);i++)
	   {
		   cin>>arr[i];
		   if(arr[i]==0)
		   {
			   cout<<"id不為0,請重新輸入:";
		   cin>>arr[i];
		   }

	   }

	   int ID=find(arr,length);
		cout<<"水軍的ID是"<<ID<<endl;
		return 0;
}
      

四、運作截圖

課堂練習-找水王
課堂練習-找水王
課堂練習-找水王

五、項目計劃日志

周活動總結表

姓名:魏**                  日期2016.5.19

日期   任務 聽課  編寫程式 閱讀課本 準備考試 日總計
周一 100 30 130
周三
周四
周總結 60 260

階段時間和效率                                            周數(上一次周活動表的周數+1):

不包括上一周在内的累計時間      

總計  100  60  260
平均
最大
最小

 以前各周的累計時間      

  60

六、時間記錄表:

學生       魏**                                           日期   2016年5月19日 

教師        王**                                          課程        軟體工程      

日期 開始時間 結束時間 中斷時間 淨時間 活動 備注
 5.16  14:30 16;20  10  上課
 18:30  19:00  無 看書
 5.18 22:00 22:30
 5.19 14:30 16:30 作業

七、個人總結

這個題目,一開始沒有思路,在老師的啟發下一開始到的是周遊清單,統計每個id出現的次數。後來老師提到了周遊然後排序,中間項肯定是水王ID,可是時間複雜度為n*n,為了降低時間複雜度,老師提示用兩兩消除的思想,後來我們就想到了如何解決。一道題目有好多種解法,我們應當拓寬思路,多看一些算法書籍,多練習寫程式,孰能生巧。

繼續閱讀