29 Jul 2020

字节跳动后端实习日常实习生凉经

一面(凉)

自我介绍 瞎扯

项目经历 侃大山

三次握手 这个我会!

输入网址后使用了哪些协议 口胡TCP,DNS,IP

内核级线程和用户级线程的区别 不会

linux查看端口占用 netstat、lsof 不会

sql会不会 会个盲注

代码题:二叉树分行打印

傻逼,先用的优先队列,在小姐姐提示下发现错了

这不是直接一个队列能搞定?优先队列纯nt

struct node {
    node* l,* r;
    int val;
    int t; //t表示层数
};
void print(node* root) {
    if(root == null) return;
    queue<node *> q;
    cout << root->val;
    int flag = root->t;
    if(root->l) q.push(root->l);
    if(root->r) q.push(root->r);
    while(!q.empty()) {
        node* temp = q.front();
        q.pop();
        if(temp->t > flag) {
            cout << endl; //换行打印
            flag = temp->t;	//表示已换行
        }
        else cout << " "; //不换行则输出分割符
        cout << temp->val;
        if(temp->l) q.push(root->l);
        if(temp->r) q.push(root->r);
    }
}

二面凉经

C++中使用extern C调用指令

UDP和TCP是否能够同时监听一个端口

HTTP的返回值

ping使用了什么协议

ping的时候返回什么东西

set,map,list的实现原理

红黑树如何增加新键值对

按下ctrl+C为什么能中断程序

是否有方法避免这种中断

Linux查看进程占用

Vim全量替换文本

线程间通信的方式

给你0.3和0.7概率的事件,如何创造0.5概率

有一个函数 f() ,每次调用的时候,可以产生[0,N)的等概率的随机整数。现在需要你通过这个函数,产生一个新函数。这个新函数每次调用的时候,会产生[L,K)的等概率的随机整数。

[0,2) –>0,1

[0,3)–>0,1,2

[0,10000000000) –>

[0,3)

现在有一个整数数组:

8,10,4,9,15,13,11,5,6

求:第一个间断的数 7

要求:

时间复杂度O(N)

空间复杂度:尽可能小(O(1))

#include <bits/stdc++.h>
using namespace std;
#define N 9
void swap(int &a, int &b) {
    a += b;
    b = a - b;
    a = a - b;
}
int main() {
    int a[N], minn;
    cin >> a[0];
    minn = a[0];
    for(int i = 1; i < N; ++i) {
        cin >> a[i];
        minn = min(minn, a[i]);
    }
    int maxn = minn + N;
    for(int i = 0; i < N; ++i) {
        if(a[i] < maxn && a[i] != i + minn) {
            swap(a[i], a[a[i] - minn]);
        }
    }
    int res = -1;
    for(int i = 0; i < N; ++i) {
        if(a[i] != i + minn) {
            res = i + minn;
            break;
        }
    }
    //for(int i = 0; i < N; ++i) cout << a[i] << endl;
    cout << res << endl;
}

三面真凉了(49min)

GDB调试的原理

为什么C++的析构函数要是虚函数

写pass构造输出,请

void pass(){



}
int main( ) {
     int x;
     x = 123;
     printf("%d \n",x);       
     pass();
     printf("%d \n",x);       
     return 0;
}

123
456

topk,一个数组,有N个元素,找到其中第K大的元素,要求平均时间复杂度尽量低。

#include <iostream>
using namespace std;
const int N = 10005;
int h[N];
int n, k;
void swap(int a, int b) {
    h[a] += h[b];
    h[b] = h[a] - h[b];
    h[a] = h[a] - h[b];
}
void heap_down(int t) {
    int tmp = 0;
    while(t * 2 <= k) {
        if(h[t] > h[2 * t]) tmp = 2 * t;
        else tmp = t;
        if(t * 2 + 1 <= k) {
            if(h[tmp] > h[t * 2 + 1]) tmp = t * 2 + 1;
        }
        if(tmp - t) {
            swap(tmp, t);
            t = tmp;
        }
        else break;
    }
}
void heap_up(int t) {
    int tmp = t;
    while(tmp) {
        if(h[tmp] < h[tmp / 2]) swap(tmp, tmp / 2);
        tmp /= 2;
    }
}
void heap_init(int t) {
    for(int i = t; i >= t / 2; --i) heap_up(i);
}
int main() {
    cin >> n >> k;
    int temp;
    for(int i = 0; i < n; ++i) {
        cin >> h[i];
    }
    heap_init(k);
    for(int i = k + 1; i <= n; ++i) {
        if(h[i] > h[1]) {
            h[1] = h[i];
            heap_down(1);
        }
    }
    for(int i = k; i >= 1; --i) cout << h[i] << endl;
}

Tags:
0 comments