复试时间出了,先把找到的真题再过一遍吧…简单题就不写上来了。
2010 网研院
2.查找第K小数
查找第K小数_牛客题霸_牛客网 (nowcoder.com)
1、思路
(1)比较简单的方法是用优先队列,用法又忘记了orz。
(2)麻烦的地方在于相同数字的处理。
优先队列priority_queue,头文件<queue>,queue不同的就在于可以自定义其中数据的优先级, 让优先级高的排在队列前面先出队。
基本操作:
- top 访问队头元素
- empty 队列是否为空
- size 返回队列内元素个数
- push 插入元素到队尾 (并排序)
- emplace 原地构造一个元素并插入队列
- pop 弹出队头元素
- swap 交换内容
定义:priority_queue<Type, Container, Functional>
Type 数据类型,Container 容器类型(Container必须是用数组实现的容器STL里面默认用的是vector),Functional 比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。
//升序队列 priority_queue <int,vector<int>,greater<int> > pq; //降序队列(默认) priority_queue <int,vector<int>,less<int> > pq;
2、源代码
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
// 升序优先队列
priority_queue<int,vector<int> , greater<int> > pq;
int num,k;
for(int i = 0 ; i < n ; i++) {
cin >> num;
pq.push(num);
}
cin >> k;
int cnt = 1; // 记录当前是第cnt小的数字
int current = pq.top(); // 获取当前队头元素
while(cnt != k) { // 当前不是第k小元素
pq.pop(); // 弹出队头元素
if(current != pq.top()) { // 新的队头元素不等于current
cnt++;
current = pq.top(); // 新的队头元素赋给current
}
}
cout << current << endl;
}
4.树查找
1、思路
(1)注意是完全二叉树,只要计算出树的深度和对应深度最左边节点和最右边节点的下标,就很好做了;
(2)计算树高用到log()函数,注意用法;
(3)最左边叶子节点和最右边叶子节点的下标计算用到pow函数,注意用法。
2、源代码
#include <cmath>
#include <iostream>
using namespace std;
int main() {
int n, d;
cin >> n;
int node[n];
for (int i = 0 ; i < n ; i++) {
cin >> node[i];
}
cin >> d;
int depth = log(n + 1) / log(2); // 计算树高
if (d > depth)
cout << "EMPTY" << endl;
int left = pow(2, d - 1) - 1 ;
int right = pow(2, d) - 2;
for (int i = left ; i <= right ; i++) {
cout << node[i] << " ";
}
cout << endl;
}