您的位置:首页 > 编程语言 > Java开发

蓝桥 算法训练 区间k大数查询(Java)

2018-03-29 22:43 190 查看
import java.util.Arrays;
import java.util.Scanner;

/*
 * 问题描述
给定一个序列,每次询问序列中第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。

 */
public class Main {
    static void f(int a[] , int l , int r , int k) {
    StringBuffer sBuffer = new StringBuffer();
    for(int i = 0;i<a.length;i++) {
    sBuffer.append(a[i]);
    }
    String s1 = sBuffer.toString();
   
    String s2 = s1.substring(l-1, r);
   
    char c[] = s2.toCharArray();
   
    Arrays.sort(c);
   
    int v=(int)c[c.length-k]-48;           //(1)将字符赋给了一个整型出现错误。
                                                        //原因:将字符赋给整型时需要进行转换,否则返回的为ACII值
   
    System.out.println(v);                                       
                                                       //(2)sort方法是将数组从小到大序列排,题目要求为从大到小
   
    }

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int a[] = new int
;
        for (int i = 0; i < a.length; i++) {
a[i] = in.nextInt();
}
        int m = in.nextInt();
        int b[] = new int [m*3];
        for(int i=0;i<b.length;i++) {
        b[i] = in.nextInt();
        }
        for(int i = 0;i<m;i++) {
        f(a, b[3*i+0],b[i*3+1], b[i*3+2]);          //(3)对于抽出数组中对应的数据时,算法出错
        }
        
}

}
以上提交错误(未在做题前思考周全就开始做题,导致花费大量时间在修改根本不需要考虑的错误上)

import java.util.Arrays;
import java.util.Scanner;

/*
 * 问题描述
给定一个序列,每次询问序列中第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。

 */
public class Main {
    static void f(int a[] , int l , int r , int k) {
    int b[] = new int [r-l+1];
    int num = 0;
    for(int i = l-1 ; i<=r-1;i++) {
    b[num] = a[i];
    num++;
    }
    Arrays.sort(b);
   
    int v=b[b.length-k];           //(1)将字符赋给了一个整型出现错误。
                                          //原因:将字符赋给整型时需要进行转换,否则返回的为ACII值
   
    System.out.println(v);                                       
                                          //(2)sort方法是将数组从小到大序列排,题目要求为从大到小
   
    }

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int a[] = new int
;
        for (int i = 0; i < a.length; i++) {
a[i] = in.nextInt();
}
        int m = in.nextInt();
        int b[] = new int [m*3];
        for(int i=0;i<b.length;i++) {
        b[i] = in.nextInt();
        }
        for(int i = 0;i<m;i++) {
        f(a, b[3*i+0],b[i*3+1], b[i*3+2]);          //(3)对于抽出数组中对应的数据时,算法出错
        }
        
}

}
修改两分钟AC
以后给自己立个规矩,不管拿到什么题,首先先思考五分钟,逼着自己这样做,哪怕是水题也一样
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  蓝桥 java