试题编号: | 201612-1 |
试题名称: | 中间数 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
解法1:
/******************************************************************************
试题编号: 201612-1 试题名称: 中间数 时间限制: 1.0s 内存限制: 256.0MB
*******************************************************************************/
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int []nums = new int[n];
boolean flag = true;
for(int i = 0;i < n;i++){
nums[i] = in.nextInt();
}
for(int j = n; j > 0; j-- ){
for(int i = 0;i < j-1 ;i++){ //先进行冒泡排序
if(nums[i]>nums[i+1]){
int tmp = nums[i+1];
nums[i+1] = nums[i];
nums[i] = tmp;
}
}
}
if(n % 2 == 0){ //如果有偶数个数
if(nums[n/2]!=nums[n/2 - 1]){
flag = false;
}else{
for(int i=1; i<n/2&&flag;i++){
if(nums[n/2-1-i] ==nums[n/2] && nums[n/2] == nums[n/2 + i]){
continue;
}else if(nums[n/2-1-i] != nums[n/2]&&nums[n/2] != nums[n/2+i]){
break;
}else{ //一个相等一个不等的情况
flag = false;
}
}
}
}else{ //奇数个
for(int i=1;i<=n/2&&flag;i++){
if(nums[n/2-i] == nums[n/2] && nums[n/2] == nums[n/2 + i]){
continue;
}else if(nums[n/2] != nums[n/2-i] && nums[n/2] != nums[n/2 + i]){
break;
}else{
flag = false;
}
}
}
System.out.println(flag?nums[n/2]:-1);
}
}
解法2:
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
int n,mid,leftCount,rightCount;
Scanner in = new Scanner(System.in);
n = in.nextInt();
int []a = new int[n];
for(int i = 0;i<n;i++){
a[i] = in.nextInt();
}
Arrays.sort(a);
mid = n/2; //中间数
leftCount = mid;
rightCount = n - mid - 1;
//关键:统计左右两边与中间数不同的值的个数
// 相同则输出中间数,否则输出-1
//去掉中间数左边与中间数值相同的个数
for(int i = mid - 1;i >= 0; i--){
if(a[i] == a[mid]){
leftCount--;
}else{
break;
}
}
//去掉中间数右边与中间数值相同的个数
for(int i = mid + 1;i < n; i++){
if(a[i] == a[mid]){
rightCount--;
}else{
break;
}
}
System.out.println((leftCount == rightCount) ? a[mid] : -1);
in.close();
}
}