和面经1是同一家公司,面试官叫我实现一个堆的插入。这道题还是非常基础的。但是,我居然答的非常不好。一方面发生的一点别的事情,影响心情;此外就是对这种线上编程经验还是太少了。
出现了以下问题:
- 中括号小括号不分。这个纯属手误。
- 各种边界没有判断。这个纯属发傻。但是也可以总结一下今后的方法:
用vector,而不是int a[N]。 - 递归写法面试官叫我改成非递归,地球人都知道递归效率没有非递归高,这样也要注意。
此外就是细心多检查,不是秀手速。因为没有编译,更没有运行。很多错误一旦发生就会让面试官觉得我这个人很不严谨。
公司是招写程序的,不是招写Bug的。
出于习惯,我还是找了一个OJ。
http://bailian.openjudge.cn/practice/4078/
接下来是自信之作。
#include <bits/stdc++.h>
using namespace std;
class Heap {
private:
vector<int> data;
int par(int pos) {
return (pos - 1) / 2;
}
void swim(int pos) {
while (pos > 0 && data[par(pos)] > data[pos]) {
swap(data[par(pos)], data[pos]);
pos = par(pos);
}
}
void sink(int pos) {
while (pos * 2 + 1 < data.size()) {
int min_child = pos * 2 + 1;
if (min_child + 1 < data.size()) {
if (data[min_child] > data[min_child + 1]) {
min_child++;
}
}
if (data[pos] < data[min_child]) {
break;
}
swap(data[pos], data[min_child]);
pos = min_child;
}
}
public:
void push(int x) {
data.push_back(x);
swim(data.size() - 1);
}
int top() {
assert(!data.empty());
return data[0];
}
void pop() {
assert(!data.empty());
swap(data[0], data[data.size() - 1]);
data.pop_back();
sink(0);
}
};
void solve()
{
Heap heap;
int n;
scanf("%d", &n);
while (n--) {
int type;
scanf("%d", &type);
if (type == 1) {
int u;
scanf("%d", &u);
heap.push(u);
continue;
}
printf("%d\n", heap.top());
heap.pop();
}
}
int main()
{
solve();
}