题目 2673:蓝桥杯2022年第十三届省赛真题-最少刷题数

遍历一个数组,遍历到的数字需要增加多少,才能使数组中比它大的个数少于比他小的个数

首先需要获取这个数组的中间值

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,23,3,4} mid=3 more=1 less=2 more<less

情况2:{1,2,23,4} mid=2 more=2 less=1 more>less

情况3:{1,234,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(" ");
        }
    }
}

没有使用前缀和、二分等算法,效率比较低,但也能通过

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值