CCF 201612-1 中間數

思路:
1。對輸入數組從小到大排序
2。從中間開始向兩邊擴展,直到擴展到數組邊界或到中心距離相等的兩元素大小不相等

#include <iostream>
using namespace std;

int findMidNumber(int a[], int &n)
{
    if(n == 1)
        return a[0];

    for(int i=0; i< n-1; i++)   //從小到大給元素排序 
    {
        int mini = i;
        int minv = a[i];
        for(int j=i+1; j<n; j++)
        {
            if(a[j] < a[mini])
                mini = j, minv = a[j];
        }
        for(int j= mini; j>i; j--)  
            a[j] = a[j-1];
        a[i] = minv; 
    }

    int j = n/2;    
    if(n%2 == 1)        //輸入奇數個元素 
    {
        int i=j, k=j; 
        while(i>=0)     //從中間向兩邊擴展,直到
                        //到達數組邊界或距離中心數字距離相等的兩數字不相等 
        {
            if(a[i]==a[j])
            {
                if(a[k] == a[j])
                    --i, ++k;
                else return -1;
            }
            else if(a[k] == a[j]) return -1;   //注意此時已經有 a[i] != a[j] 
            else return a[j];
        }   
    }
    else                //輸入偶數個元素
    {
        int i = n/2-1;
        if(a[i] != a[j]) return -1;


        else while(i > 0 )
        {
            if(a[i] == a[j])
                --i, ++j;   
            else if(a[i] == a[i+1] || a[j] == a[j-1])
                return -1;
            else
                return a[i+1];      
        }
        return a[1];  //之前的return都沒有起作用,說明整個數組元素均相等 
    }   
}
int main()
{
    int n;
    int a[1001];
    cin>>n;
    for(int i=0; i<n; i++)
        cin>>a[i];

    cout<<findMidNumber(a, n); 

    return 0;       
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章