陣列的主元素查詢

weixin_46863706發表於2020-10-31

描述

已知一個整數序列A=(a0, a1,…an-1),其中0≤ai<n(0≤i<n)。若存在ap1=ap2…=apm=x 且m>n/2(0≤pk<n,1≤k≤m),則稱x為A的主元素。例如A=(0,5,5,3,5,7,5,5),則5為主元素;又如A=(0,5,5,3,5,1,5,7),則A中沒有主元素。假設A中的n個元素儲存在一個一維陣列中,請設計一個儘可能高效的演算法,找出A的主元素。若存在主元素,則輸出該元素;否則輸出-1。
輸入
多組資料,每組資料兩行。第一行為一個整數n,代表陣列中有n個元素。第二行為陣列中的n個元素(元素之間用空格分隔)。當n等於0時,輸入結束。
輸出
每組資料輸出一行,若陣列中存在主元素,輸出主元素的值,若陣列中不存在主元素,則輸出-1。
輸入樣例 1
8
0 5 5 3 5 7 5 5
9
0 5 5 3 5 1 5 7 0
0
輸出樣例 1
5
-1

注意學習這裡用陣列儲存另一個陣列相同元素資訊的方法。

#include<iostream>
#define MAXSIZE 100 
using namespace std;
//陣列中某數相等的數過半, 稱之為主要元素 
//好好學習此方法 
void MainElem(int *a,int num) 
{
 int count[100]={0};//全部初始化為0,用於儲存陣列A中每個數的個數 
 int i,max,mainelem;
 for(i=0;i<num;i++)
  count[a[i]]++;
 max=count[a[0]];
 mainelem=a[0];
 for(i=0;i<num;i++)
 {
  if(max<count[a[i]])
  {
   max=count[a[i]];
   mainelem=a[i];
  }
   
 }
 
 if(max>num/2)
  cout<<mainelem<<endl;
 else
  cout<<"-1"<<endl;
} 

int main()
{
 int a[MAXSIZE];
 int num;//陣列長度 
 while(1)
 {
  cin>>num;
  if(num==0)
   break;
  else
  {
   for(int i=0;i<num;i++)
    cin>>a[i];
   MainElem(a,num);
  }
 }
 return 0;
}

相關文章