第l个数到第r个数中第K大的数是哪个———蓝桥杯

蓝桥杯校内预选赛题

欢迎大佬批评指正!!!

问题描述

给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。
输入格式
第一行包含一个数n,表示序列长度。
第二行包含n个正整数,表示给定的序列。
第三个包含一个正整数m,表示询问个数。
接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。

输出格式
总共输出m行,每行一个数,表示询问的答案。

样例输入
5
1 2 3 4 5
2
1 5 2
2 3 2

样例输出
4
2

数据规模与约定
对于30%的数据,n,m<=100;
对于100%的数据,n,m<=1000;
保证k<=(r-l+1),序列中的数<=106。问题描述
给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。

分析:

1.我们先按题目完成输入语句
写输入语句时需要注意,在用完 .nextInt()之后我们需要重新创建一个新的Scanner对象,再来写.nextLine(),但是反过来就不需要重新写对象了。这是因为在 .nextInt()会默认读入一个空格,直接用.nextLine(),就会被认为用户输入的就是空格。
2.输入的时候我们是把读入的l.k.r放在字符串中的,我们需要把该字符串转化为整形数组,方便我们之后使用下标来获取l,k,r的值。
在这里插入图片描述3.随后我们根据l和k值截取源字符串
在这里插入图片描述把截取的数据放到整形数组里方便排序和对元素进行下标操作
在这里插入图片描述然后对截取后的元素进行升序排序
在这里插入图片描述
我们将截取后的每行元素放到一个一维数组里,最后直接根据下标和截取的规则(substring是截头不截尾)获取要求的r
在这里插入图片描述

代码:
import java.util.Arrays;
import java.util.Scanner;

public class Main4 {
    public static void main(String[] args) {
        //1.第一行包含一个数n,表示序列长度。
        Scanner in0=new Scanner(System.in);
        int n=in0.nextInt();

        //2.第二行包含n个正整数,表示给定的序列。
        Scanner in1=new Scanner(System.in);
        String str1=in1.nextLine();

        // 3.第三个包含一个正整数m,表示询问个数。
        int m=in1.nextInt();

        //4.接下来m行,每行三个数l,r,K,
        Scanner in2=new Scanner(System.in);
        int arr[][]=new int[m][3];
        for(int i=0;i<m;i++){
            String str2=in2.nextLine();
            String[] st=str2.split("\\s");//
            for(int j=0;j<3;j++){
                //将输入的字符串放到整形的二维数组中;
                arr[i][j]=Integer.parseInt(st[j]);
            }
           // System.out.println(Arrays.toString(arr[i]));
        }
    //5.截取字符串
        for(int i=0;i<m;i++){
            String str3=str1.substring(arr[i][0]-1,arr[i][1]);
            int arr2[]=new int[str3.length()];
            for(int j=0;j< str3.length();j++){
                arr2[j]=Integer.parseInt(String.valueOf(str3.charAt(j)));
            }
            Arrays.sort(arr2);
            System.out.println(arr2[arr2.length-arr[i][2]]);
        }
    }
}
运行结果:

在这里插入图片描述再加一个牛客上刷到的类似的题

问题描述

找出n个数里最小的k个数

输入描述:
每个测试用例包括用空格分开的n+1个数,最后一个整数值为k
输出描述:
输出n个整数里最小的k个数

示例:
输入
3 9 6 8 -10 7 -11 19 30 12 23 5
输出
-11 -10 3 6 7

代码:
import java.util.Arrays;
import java.util.Scanner;

public class Main1 {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        String str=in.nextLine();
        String st[]=str.split(" ");
        int k=Integer.parseInt(st[st.length-1]);
        int []arr=new int[st.length-1];
        for(int i=0;i<st.length-1;i++){
            arr[i]=Integer.parseInt(st[i]);
        }
        Arrays.sort(arr);
        for(int i=0;i<k;i++){
            System.out.print(arr[i]+" ");
            }
        }
    }
运行结果:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值