第三章:查詢與排序(下)----------- 3.11 趣味擴充_尋找發帖水王

Curtis_發表於2019-03-10

程式設計之美_尋找發帖水王:

變化:出現的次數恰好為個數的一半,求這個數。

關於加強版水王的題,可以通過掃描一遍陣列就能解決問題:

水王佔總數的一半,說明總數必為偶數;

不失一般性,假設每隔一個數就是水王的id,兩兩不同最後一定會消為0;

水王可能是最後一個元素,每次掃描到時候,多一個動作,和最後一個元素作比較,單獨計數,計數恰好為一半;

如果不是,那麼去掉最後一個元素,水王就是留下來的那個candidate

 

#include <iostream>
#include<algorithm>
using namespace std;

void waterKing(int arr[],int length){
	int candidate=arr[0];
	int nTime=0;
	int countOfLast=0;//統計最後這個元素出現的次數 
	int N=length;
	for(int i=0;i<N;i++){
		//增加與最後一個元素比較的步驟 
		if(arr[i]==arr[N-1]){
			countOfLast++;
		}
		if(nTime==0){
			candidate=arr[i];
			nTime=1;
			continue; 
		}
		if(arr[i]==candidate){
			nTime++;
		}
		else{
			nTime--;
		}
	}
	//最後一個元素出現的次數是n/2 
	if(countOfLast==N/2){
		cout<<arr[N-1];
	}
	else{
		cout<<candidate;
	}
}
 
int main()
{
	int arr[]={1,3,5,2,1,3,1,1};
	waterKing(arr,8);
	return 0;
}

結果:

 

 

相關文章