第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的值。
第l个数到第r个数中第K大的数是哪个———蓝桥杯
文章图片
3.随后我们根据l和k值截取源字符串
第l个数到第r个数中第K大的数是哪个———蓝桥杯
文章图片
把截取的数据放到整形数组里方便排序和对元素进行下标操作
第l个数到第r个数中第K大的数是哪个———蓝桥杯
文章图片
然后对截取后的元素进行升序排序
第l个数到第r个数中第K大的数是哪个———蓝桥杯
文章图片

我们将截取后的每行元素放到一个一维数组里,最后直接根据下标和截取的规则(substring是截头不截尾)获取要求的r
第l个数到第r个数中第K大的数是哪个———蓝桥杯
文章图片

代码:

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

运行结果: 第l个数到第r个数中第K大的数是哪个———蓝桥杯
文章图片
再加一个牛客上刷到的类似的题
问题描述 找出n个数里最小的k个数
【第l个数到第r个数中第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.length-1; i++){ arr[i]=Integer.parseInt(st[i]); } Arrays.sort(arr); for(int i=0; i

运行结果: 第l个数到第r个数中第K大的数是哪个———蓝桥杯
文章图片

    推荐阅读