CSP 201612-1中间数

试题编号: 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();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_18287147/article/details/106967293