第 k 大的整数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44593822/article/details/102755867

题目:

求 n 个整数中第 k(1≤k≤n) 大的整数。

输入格式

n 和 k
n 个整数

输出格式

第 k 大的整数

输入样例

10 3
2 5 -1 9 25 0 12 4 -7 12

输出样例

12

思路:

题目没有给出明确的数据量(数据大小和范围),这道题我没提交测试,所以只知道样例对了,但为了防止超时,我用数组来代替排序,因为当数据量大时排序必然超时,所以直接不排序(用数组下标就代替了)。

注意:题意要求相同的数字有多个也得单独排列,所以减去每个数字的数量
           eg:样例中前3大的为25,12,12,所以k=3时输出12
           所以有count-=positive[i];这行代码

代码

import java.util.*;
public class 第k大的整数 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int k=in.nextInt();
        int[] positive=new int[10000];//存放正数
        int[] negative=new int[10000];//存放负数
        for(int i=0;i<n;i++){
        	int num=in.nextInt();
        	//用数组代替排序
        	//有数就相应位置自加,没有的数数量为0
        	if(num>=0){
        		positive[num]++;
        	}
        	else{
        		negative[-num]++;
        	}
        }
        int count=k;
        for(int i=positive.length-1;i>=0;i--){
        	if(positive[i]!=0){
        		//题意要求相同的数字有多个也得单独排列,所以减去每个数字的数量
        		//eg:样例中前3大的为25,12,12,所以k=3时输出12
        		count-=positive[i];
        		if(count==0){
        			System.out.println(i);//下标即代表相应的数字
        			break;
        		}
        	}
        }
        if(count>0){//第k大的数为负数
        	for(int i=1;i<negative.length;i++){
        		if(negative[i]!=0){
        			count--;
        			if(count==0){
        				System.out.println(-i);
        				break;
        			}
        		}
        	}
        }
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_44593822/article/details/102755867