笔试题:乱序求第n大(小)的数。我能想到的最好的方法。

#include <iostream>
using namespace std;
//当然用快速排序也是一样的。
class Heap
{
	public:
	Heap(){}
	void Insert(int a[],int len,int N)
	{
		data = new int[N];
		size = N;
		for(int i=0;i<N;i++)
		{
			data[i]=a[i];
		}
		int n = N/2;
		while(n>=0)
		{
			SetVal(data,n);
			n--;
		}
		for(int i=N;i<len;i++)
		{
			if(data[0]>a[i])
			{
				data[0]=a[i];
				SetVal(data,0);
			}
		}
	}
	void SetVal(int a[],int n)
	{
		int i = n;
		int j = i*2+1;
		while(j<size)
		{
			if(j+1<size && data[j]<data[j+1])
			j=j+1;
			if(data[i]<data[j])
			{
				int temp = data[i];
				data[i] = data[j];
				data[j] = temp;
			}
			i = j;
			j = i*2+1;
		}
	}
	int GetNum()
	{
		return data[0];
	}
	~Heap()
	{
		if(data)
		delete []data;
	}
	private:
	int *data;
	int size;
};

int find_n_min(int a[],int n,int val)
{
 Heap hp;//我使用的大堆求解的,虽然是大堆,我却将较小的数插入,
//然后在这一组较小的数里面,按照大堆的升序方式,让第一个下标的位置保存我需要找到的值。
 hp.Insert(a,n,val);
	return hp.GetNum();
}

int main()
{
	int a[]={2,3,4,5,6,11,2,3,3,4,4,5,5,6,0,0,0};
	cout<<find_n_min(a,sizeof(a)/sizeof(int),4)<<endl;
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 00:10:54

笔试题:乱序求第n大(小)的数。我能想到的最好的方法。的相关文章

笔试题学习(dp,重叠子问题,卡特兰数,手电过桥,最长公共子序列)

卡特兰数:https://blog.csdn.net/doc_sgl/article/details/8880468 dp,重叠子问题:https://www.cnblogs.com/hapjin/p/5572483.html 美团2016校招笔试题:https://zhuanlan.zhihu.com/p/29308843 大厂面试经验:https://mp.weixin.qq.com/s?__biz=MzI2OTQxMTM4OQ==&mid=2247484859&idx=1&s

hdu 2838 Cow Sorting 树状数组求所有比x小的数的个数

Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4766    Accepted Submission(s): 1727 Problem Description Sherlock's N (1 ≤ N ≤ 100,000) cows are lined up to be milked in the evening.

最快效率求出乱序数组中第k小的数

题目:以尽量高的效率求出一个乱序数组中按数值顺序的第k 的元素值 思路:这里很容易想到直接排序然后顺序查找,可以使用效率较高的快排,但是它的时间复杂度是O(nlgn),我们这里可以用一种简便的方法,不一定需要排序,使用快速排序中双向分区的扫描方法,扫描出主元下标,然后根据主元的值将数组划分成一半大,一半小.然后再根据主元下标与k进行比较,如果相等,说明主元就是我们要找的数,如果大于k,说明k所代表的值在小的那边,继续向小的那部分递归,如果小于k,说明k代表的值在大的那边,继续向大的那部分递归.这

[亚马逊amazon] 在线笔试题 大于非负整数N的第一个回文数 Symmetric Number

1.题目 如标题,求大于整数N(N>=0)的第一个回文数的字符串表示形式. 这个题目也是当时笔试第一次见到,花了一个小时才做出了.慢慢总结还是挺简单的. 2.分析 分析如下: (1)一位数N(9除外). 第一个大于N回文数等于N+1,如大于3的第一个回文数是4. (2)奇数位(一位数除外) 需要看“左边反转数字”是否大于"右边数字". 1)如果小于等于,则“左边+中间字母”组成的数字+1,再对称就可以. 2)如果大于,则左边数字直接对称到右边就可以啦. (3)偶数位 需要看“左边

(转载)c++笔试题汇总

今天去9City笔试才发现很多基本的东西都忘记了,以后面试前要看看这篇文章了!唉,老了! ①链表反转 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题.比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1. 最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历.源代码如下: struct linka {

2015-4-2的阿里巴巴笔试题:乱序的序列保序输出(bit数组实现hash)

分布式系统中的RPC请求经常出现乱序的情况.写一个算法来将一个乱序的序列保序输出.例如,假设起始序号是1,对于(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)这个序列,输出是:123, 4, 567, 8, 9, 10 上述例子中,3到来的时候会发现4,5已经在了.因此将已经满足顺序的整个序列(3, 4, 5)输出为一行. 1 #include<stdio.h> 2 3 int main() 4 { 5 int num ; 6 while(scanf("%d"

阿里巴巴 2015 实习笔试题 分布式系统中的RPC请求经常出现乱序的情况 写一个算法来将一个乱序的序列保序输出

分布式系统中的RPC请求经常出现乱序的情况. 写一个算法来将一个乱序的序列保序输出.例如,假设起始序号是1,对于(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)这个序列,输出是: 1 2 3, 4, 5 6 7, 8, 9, 10 上述例子中,3到来的时候会发现4,5已经在了.因此将已经满足顺序的整个序列(3, 4, 5)输出为一行. 要求: 1. 写一个高效的算法完成上述功能,实现要尽可能的健壮.易于维护 2. 为该算法设计并实现单元测试 貌似效率不是很高,有时间的时候改进下.

一位上了一个大的互联网公司笔试题分享

声明: 首先声明,我没有参加中考(我的老男人).我只是道听途说.这个测试题是否真的存在?谁知道! 在这一点,但想分享一些知识. 有关文字说明原来的问题: 给定一个二维数组,里面随机的填写0和1.求取把上下左右连续(斜线不算相连)的1周边0的个数. 在这里能够把由1构成数据看成一个岛屿,求岛屿海岸线的长度,即周边0的个数. 引子: 看过人机博弈-吃子棋游戏(二)算气的博友,应该瞬间就有思路了吧.事实上围棋的算气,在没有眼位的情况下,就是计算算实心岛屿的海岸线.在有眼位的情况下.围棋算气也是计算空心

笔试题大搜索1

1.实现一个函数,对一个正整数n,算得到1需要的最少操作次数.操作规则为:如果n为偶数,将其除以2:如果n为奇数,可以加1或减1:一直处理下去. 例子:func(7) = 4,可以证明最少需要4次运算n = 7n-1 6n/2 3n-1 2n/2 1要求:实现函数(实现尽可能高效) int func(unsign int n):n为输入,返回最小的运算次数.给出思路(文字描述),完成代码,并分析你算法的时间复杂度.答: [cpp] view plaincopy int func(unsigned