蓝桥算法训练--比较

这里写自定义目录标题

题目详情

问题描述
  给出一个n长的数列,再进行m次询问,每次询问询问两个区间[L1,R1],[L2,R2],
  询问数列第L2到R2个数字每一个数在数列第L1到R1个数中有多少个数字不大于它。
输入格式
  第一行两个整数n,m
  第二行n个整数,表示数列。
  接下来m行,每行四个整数L1,R1,L2,R2,意义如上
输出格式
  m行,每行R2-L2+1个整数,第一个整数表示第L2个数在数列第L1到R1个数中不大于它的个数,第一个整数表示第L2+1个数在数列第L1到R1个数中不大于它的个数,以此类推
样例输入
5 3
5 2 3 4 1
1 2 3 4
2 3 1 5
1 5 2 3
样例输出
1 1
2 1 2 2 0
2 3
数据规模和约定
  n,m<=1000,数列的数字非负且小于1000。

思路

由于本题是多行输入、多行输出,所以我选择了用函数调用的方式,一次输入对应调用一次函数来实现对应输出,个人认为这样不容易乱
具体实现代码中有注释

完整代码实现

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();  //数据序列一行n个整数
        int []num = new int[n];
        int m = scanner.nextInt();  //m行数据
        int [][]arr = new int[m][4];  //L1 R1 L2 R2
        for (int i=0;i<n;i++){     //输入n个数据
            num[i] = scanner.nextInt();
        }
        for(int i=0;i<m;i++){      //循环输入m行
            for (int j=0;j<4;j++){  //每行循环输入4个数字L1  R1  L2  R2
                arr[i][j] = scanner.nextInt();
            }
        }
        int row = 0;
        while(row < m){  //控制循环输出m行
            print(num,arr,row);  //以调用函数次数 每次调用打印一行数据
            System.out.println();
            row++;
        }
    }

    private static void print(int[] num, int[][] arr, int row) {
        int point = arr[row][2] - 1;  //L2  --作为下标在num数组中定位用来比较的数
        for (int i = 0;i<arr[row][3] - arr[row][2] + 1;i++){    //控制一行输出的数字个数R2-L2+1
            int count = 0;
            for (int j = arr[row][0] - 1; j <= arr[row][1] - 1; j++) {  //每个输出的整数比较的次数R1-L1
                if(num[j] <= num[point]){
                    count++;
                }
            }
            point++; //L2+1 ……
            System.out.print(count+" ");
            if(point >= num.length){  //
                break;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值