首页 > 字节实习面试(3-23一面 3-28二面 3-30三面)
头像
林不厌
编辑于 2021-03-30 15:45
+ 关注

字节实习面试(3-23一面 3-28二面 3-30三面)

一面:
第一步自我介绍。
第二步,先问了我线程和进程的区别,这一块我没有系统学过,说了一点儿就告诉面试官我不怎么会;然后问TCP/IP如何实现可靠传输,balabala讲了一堆都没讲到点子上,因为我确实没背过这些东西。。。再问数据库,我也不会。
面试官只好让我谈谈我实验室做的项目,我是做机器人的,介绍了一堆他可能也没咋听懂,以上一共花了十几分钟吧。
第三步,做题。先问了一个给一组数有正有负,输出正负交替,多余的就全放在后面,让我先写,写完了再给他讲,他好像说是给二十分钟?我思路就是用一个标记flag表示当前需要正数还是负数,遍历数字,如果当前是需要的数字就flag=!flag然后continue,如果不是就往后找一个需要的数字跟它交换位置,然后flag=!flag。
#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> a = {-1, 3, 2, 4, 5, -6, 7, -9};
    bool flag = true;
    for (int i = 0; i < a.size(); ++i){
        if (flag && a[i]>=0){
            flag = !flag;
            continue;
        }
        if (!flag && a[i]<0){
            flag = !flag;
            continue;
        }
        if (flag){
            int j = i + 1;
            while (j < a.size() && a[j] < 0) ++j;
            if (j == a.size()) break;
            swap(a[i], a[j]);
        }
        else {
            int j = i + 1;
            while (j < a.size() && a[j] >= 0) ++j;
            if (j == a.size()) break;
            swap(a[i], a[j]);
        }
        flag = !flag;
    }
    for (auto& num : a) cout << num << " " ;
    return 0;
}


又问了一个单链表,从k处断开成两条,然后前面那条放到后面那条的尾部去,k可能大于链表本身长度,需要循环回来,要求把找到k处的过程输出出来。
#include <iostream>
#include<vector>
using namespace std;
struct List
{
    int val;
    List* next;
    List(int v) : val(v) , next(nullptr){}
};
int main() {
    vector<int> a = {1, 2, 3, 4, 5, 6};
    int k;
    cin >> k;
    List* head = new List(0);
    List* p = head;
    for (int i = 0; i < a.size(); ++i){
        p->next = new List(a[i]);
        p = p->next;
    }
    p = head;
    while (k){
        cout << p->next->val << " ";
        if (p->next->next == nullptr) p = head;
        else p = p->next;
        --k;
    }
    List* ans = p->next;
    List* q = ans;
    while (q->next != nullptr) q = q->next;
    q->next = head->next;
    p->next = nullptr;
    q = ans;
    cout << endl;
    while (q){
        cout << q->val << " ";
        q = q->next;
    }
    return 0;
}
第四步,你有什么问题想问我?我问咋学基础知识,答做项目。
基础知识我是真背不下来啊,背书太难了!!!

二面:
没有自我介绍,直接聊实验室做的项目,然后说他觉得我这个体现不了互联网工程思维,对我是否适合做后端开发提出质疑,经历了漫长的解释面试官勉强接受吧。
聊一聊面向对象,我对多态的解释还可以,他表示满意。
给你一组数据,包含学号姓名以及各种信息,希望按学号有序存储,你用什么数据结构。
聊一聊链表和集合。
做题,接雨水,我说单调栈,面试官对我的思路表示不理解,“你凭什么会想到单调栈,这不符合正常解决问题的思维,你应该最直接的想法怎么可能是单调栈?”然后我只好说我见过这题,单调栈是比较优化的解法,并且好理解。“这个怎么会好理解,而且这个也不是最优解,最优解只需要一次遍历,空间复杂度O(1)。”经历了漫长的解释面试官认为我的做法可行,然后他给我介绍了双指针的做法。然后他说超时了,代码就不写了。
聊的太发散了,有些问题记不住了,总体来讲感觉他不像一个写业务代码的人,更像是一个架构?
没想到给我过了。

三面:
自我介绍,你擅长什么语言?我说C++,然后问了C++是如何实现泛型编程的,C++运行时内存分配,C++指针放在哪个区域。
段页式管理每一次数据访问要访问几次内存,如果有缓存呢?用什么缓存?有哪些缓存?(给我问懵了)
死锁发生条件和处理策略。
散列表哈希化方式有哪些?如何处理哈希冲突?(这个记不住了,C++一般不问这个,《大话数据结构》里面有但没记住)
TCP拥塞控制。
输入URL显示无法访问怎么办?(这个我更懵逼了)
你觉得你有什么知识点我还没问到?我说我对C++比较熟悉,就又问了一个new和malloc的区别。
做题,无序数组找中位数,我说我的思路是模拟快排,但是中位数如果数组元素数量是偶数需要运行两次这个过程,面试官说你就按照奇数个来写就行。
#include <iostream>
#include<vector>
using namespace std;

int work(vector<int>::iterator left, vector<int>::iterator right, int k){
    if (left >= right) return -1;
    int val = *left;
    vector<int>::iterator x = left + 1;
    vector<int>::iterator y = right - 1;
    while ( x <= y ){
        while (*x < val) ++x;
        while (*y > val) --y;
        if (x <= y){
            swap(*x, *y);
            ++x;
            --y;
        }
    }
    swap(*left, *y);
    int len = y - left + 1;
    if (len == k) return *y;
    if (len < k) return work(y+1, right, k-len);
    return work(left, y, k);
}
int main() {
    vector<int> num = {1, 2, 3, 4 ,5 ,6, 7};
    int n = num.size();
    int k = 1 + n / 2;
    cout << work(num.begin(), num.end(), k) << endl;
    return 0;
}
基础知识还是不过关,继续加油!

更多模拟面试

全部评论

(4) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐