![](https://i-blog.csdnimg.cn/blog_migrate/6fcc7790983999e00edd6f444beeacf8.png)
遍历一个数组,遍历到的数字需要增加多少,才能使数组中比它大的个数少于比他小的个数
首先需要获取这个数组的中间值
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();
}
sc.close();
int[] sortarr = arr.clone();
Arrays.sort(sortarr);
int mid = sortarr[n/2];
将数组中比中间值mid大的记数为more,比mid小的记数为less
情况1:{1,2,3,3,4} mid=3 more=1 less=2 more<less
情况2:{1,2,2,3,4} mid=2 more=2 less=1 more>less
情况3:{1,2,3,4,5} mid=3 more=2 less=2 more=less
for(int i: arr) {
if(i<mid) less++;
else if(i>mid) more++;
}
为满足题意
情况1:当前值需要增加至 大于或等于mid(可以是等于)
情况2:当前值需要增加至 大于mid(只能是大于)
情况3:当前值需要增加至 大于或等于mid(比mid小的只能是大于,与mid相等的可以是等于)
增加两个标志位 flag midflag 用于区分上述三种情况
int flag=0 , midflag=0;
if(more>=less) flag=1;
if(more>less) midflag=1;
for(int i=0 ; i<n ; i++){ //遍历判断每个数是小于、等于还是大于mid
if(arr[i]<mid){
System.out.print(mid+flag-arr[i]); //flag=1时是case2,3 =0时是case1
}else if(arr[i]==mid && midflag==1){
System.out.print(mid+midflag-arr[i]); //midflag=1时是case2 =0时是case1,3
}else{
System.out.print("0");
}
}
综上,完整代码如下
import java.util.Arrays;
import java.util.Scanner;
public class ProblemStatistics {
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();
}
sc.close();
int[] sortarr = arr.clone();
Arrays.sort(sortarr);
int mid = sortarr[n/2];
int more=0 , less=0;
for(int i: arr) {
if(i<mid) less++;
else if(i>mid) more++;
}
int flag=0 , midflag=0;
if(more>=less) flag=1;
if(more>less) midflag=1;
for(int i=0 ; i<n ; i++){ //遍历判断每个数是小于、等于还是大于mid
if(arr[i]<mid){
System.out.print(mid+flag-arr[i]); //flag=1时是case2,3 =0时是case1
}else if(arr[i]==mid && midflag==1){
System.out.print(mid+midflag-arr[i]); //midflag=1时是case2 =0时是case1,3
}else{
System.out.print("0");
}
if(i<n-1) System.out.print(" ");
}
}
}
没有使用前缀和、二分等算法,效率比较低,但也能通过
![](https://i-blog.csdnimg.cn/blog_migrate/7c9e8b140c9782f76890aff5d4751a45.png)