题目描述
给你一个长度为n的数列,如果数列中一个数与其余n-1个数差的绝对值之和最小,这个数就是完美数。
输入
第一行一个数n,第二行n个数(1<=n<=10000)
输出
这个数列中的完美数,如果有多个输出任意一个
样例输入
6
1 2 3 5 7 100
样例输出
3
在这里我采用两种方法,思路分别是:
方法一:根据中位数的性质:
由此,我们对所给的数的序列进行排序,如果是个数为奇数,则中间的数为完美数;如果个数为偶数,则中间两个数为完美数。
其实在这里,中位数就充当了题目中说的完美数。
方法二:采用暴力搜索的方式,也就是对数组元素进行遍历。从数组元素的第一个元素开始,记录该元素与其他元素差的绝对值之和,然后通过一个min记录下和的最小值,同时把该元素的值赋给一个新的变量result,最后输出result。
代码如下:
方法一:
public class PerfectNumber {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int n = in.nextInt();
int[] arr = new int[n];
//往数组填充数据
for (int i = 0; i < n; i++) {
arr[i] = in.nextInt();
}
//对数组进行元素进行排序
Arrays.sort(arr);
//对排序后的数组进行判断:如果元素个数为奇数,输出中间那个数;如果为偶数,输出中间两个数中的任意一个即可
if(n%2 == 0){
System.out.println(arr[n/2-1]);
}else{
System.out.println(arr[n/2]);
}
}
}
}
方法二:
import java.util.Arrays;
import java.util.Scanner;
public class PerfectNumber {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int n = in.nextInt();
int[] arr = new int[n];
//往数组填充数据
for (int i = 0; i < n; i++) {
arr[i] = in.nextInt();
}
//定义一个输出变量res
int res = 0;
int min = 10000;
for(int i=0;i<n;i++){
int sum = 0;
for(int j=0;j<n;j++){
sum += Math.abs(arr[i]-arr[j]);
}
if (sum < min){
min = sum;
res = arr[i];
}
}
System.out.println(res);
}
}
}