面经2 实现堆

面经1是同一家公司,面试官叫我实现一个堆的插入。这道题还是非常基础的。但是,我居然答的非常不好。一方面发生的一点别的事情,影响心情;此外就是对这种线上编程经验还是太少了。
出现了以下问题:

  1. 中括号小括号不分。这个纯属手误。
  2. 各种边界没有判断。这个纯属发傻。但是也可以总结一下今后的方法:
    用vector,而不是int a[N]。
  3. 递归写法面试官叫我改成非递归,地球人都知道递归效率没有非递归高,这样也要注意。
    此外就是细心多检查,不是秀手速。因为没有编译,更没有运行。很多错误一旦发生就会让面试官觉得我这个人很不严谨。
    公司是招写程序的,不是招写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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值