1. 程式人生 > >CCF201612 中間數(JAVA)

CCF201612 中間數(JAVA)

 

描述:

問題描述

  在一個整數序列a1, a2, …, an中,如果存在某個數,大於它的整數數量等於小於它的整數數量,則稱其為中間數。在一個序列中,可能存在多個下標不相同的中間數,這些中間數的值是相同的。
  給定一個整數序列,請找出這個整數序列的中間數的值。

輸入格式

  輸入的第一行包含了一個整數n,表示整數序列中數的個數。
  第二行包含n個正整數,依次表示a1, a2, …, an

輸出格式

  如果約定序列的中間數存在,則輸出中間數的值,否則輸出-1表示不存在中間數。

樣例輸入

6
2 6 5 6 3 5

樣例輸出

5

樣例說明

  比5小的數有2個,比5大的數也有2個。

樣例輸入

4
3 4 6 7

樣例輸出

-1

樣例說明

  在序列中的4個數都不滿足中間數的定義。

樣例輸入

5
3 4 6 6 7

樣例輸出

-1

樣例說明

  在序列中的5個數都不滿足中間數的定義。

評測用例規模與約定

  對於所有評測用例,1 ≤ n ≤ 1000,1 ≤ ai ≤ 1000。

package intermediateNumber;

import java.util.Scanner;

public class Main {
	@SuppressWarnings("resource")
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();// 整數個數
		int[] arr = new int[n];
		for (int i = 0; i < n; i++) {
			arr[i] = sc.nextInt();
		}
		System.out.println(midNum(arr));
	}

	public static int midNum(int[] arr) {
		for (int i = 0; i < arr.length - 1; i++)
			// 排序
			for (int j = 0; j < arr.length - 1 - i; j++) {
				if (arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		int mid = (arr.length) / 2;// 中位數下標
		if (arr.length % 2 == 0)// 整數個數為偶數
		{
			if (arr[mid] != arr[mid - 1])// 中間兩個數不相等
				return -1;
			else {
				for (int a = 1; (mid + a < arr.length)
						&& (arr[mid + a] == arr[mid] || arr[mid - 1 - a] == arr[mid]); a++)
					// 經排序過後中間數若有重複必然對稱出現,否則不合題意
					if (arr[mid + a] != arr[mid - 1 - a])
						return -1;
			}
		} else// 整數個數為奇數
		{
			for (int a = 1; (mid + a < arr.length)
					&& (arr[mid + a] == arr[mid] || arr[mid - a] == arr[mid]); a++)
				// 經排序過後中間數若有重複必然對稱出現,否則不合題意
				if (arr[mid + a] != arr[mid - a])
					return -1;
		}
		return arr[mid];
	}
}