快手C++一二面(offer)

快手的面试来得很迷。一开始我投的C++岗位,测评和笔试都做了,而且笔试还a了两道多,但是后来官网上显示“不合适”。简历挂,好伤心,所以在官网又投了一次,不过是有另一个部门的C++岗位。某天hr打电话给我约面试时间,我当时有点懵。这都有面试机会?这都行?疑惑?哈哈哈,可能是人品爆发了吧。

实习一面

  • 自我介绍

  • 介绍C++内存配置器

  • 调用malloc的时候要求 8 bytes 内存对齐,怎么处理?

  • 实现lower_bound

  • 虚函数相关

    class A {
        virtual void foo() = 0;
    };
    class B : public  A{
    
    };
    • sizeof(A)在 32 位的机器上会出现什么问题?
    • 使用class B的话,后续可能会出现什么问题?(析构函数不是虚函数)
    • 编译器为class B生成了哪些函数?有右值版本的函数吗?
  • static的作用,下面例子合法吗?

    // a.cpp
    static int a = 0;
    
    // b.cpp
    extern int a;
  • const_cast的作用

  • 下面例子中,std::move失效的情况,即没有调用右值版本的push_back()。(A是内置类型或者A没有右值版本的拷贝构造函数)

    vector<A> a;
    a.push_back(A());
  • 介绍智能指针

  • 几何题:3d空间中一点到一条直线的距离?

实习二面

  • 自我介绍

  • 看到我学过前端,所以开局是一道JavaScript的题。(被问懵了,我记得我投的是C++岗呀)

    // 解释 this 的指向
    this.a = 10;
    
    function XXX(){
        this.a = 100;
    }
    var xx = new XXX()
  • 下面代码的输出是:

    #include <string>
    #include <iostream>
    using namespace std;
    
    int main() {
        {
            std::string s = "1234";
            cout << s << endl; // "1234"
        }
        {
            std::string s = "1234";
            std::move(s);
            cout << s << endl; // "1234"
        }
        {
            std::string s = "1234";
            const auto& s1 = std::move(s);
            cout << s << ' ' << s1 << endl; // "1234 1234"
        }
        {
            std::string s = "1234";
            auto&& s1 = std::move(s);
            cout << s << ' ' << s1 << endl; // "1234 1234"
        }
    
        {
            std::string s = "1234";
            auto s1 = std::move(s);
            cout << s << ' ' << s1 << endl;  // " 1234"
    
        }
    
        return 0;
    }
  • 下面代码会出现什么问题?

    • 面试的时候答了字符串是局部变量,会被销毁。但是面完之后,细想觉得回答错了。"123"是字面量、常量,存储在常量区,应该不会被销毁。请问我的思路对吗?请指点指点!
    #include <iostream>
    #include <string>
    
    std::string getString() {
            return "123";
    }
    
    int main() {
        const char* s = getString().c_str();
        std::cout << s << std::endl; // "123"
        return 0;
    }
  • 使用 sort 函数对 vec 按 index 大小进行从小到大的排序。其中的比较函数只是判断了小于的情况,但是 sort 函数怎么判断相等的情况?

    struct S {
        int index;
        float data;
    };
    
    std::vector<S> vec0 = { {0,1}, {0,2} };
  • 怎么让一个类获取到自己的shared_ptr?主要考察enable_shared_from_this,我忘了怎么使用了,所以就没要求继续做题目。

  • 写一个函数, 对于所有基本类型, 直接使用 std::cout 输出,对于 std::string 输出它的长度。

    // 实现一
    // 一开始使用特化版本实现
    template <class T>
    void print(const T& val) {
        std::cout << val << std::endl;
    }
    
    template <>
    void print(const string& val) {
        std::cout << val.size() << std::endl;
    }
    
    // 实现二
    // 一开始没听清,面试官一开始提示用 type_traits 可以实现,
    // 特化的实现写完之后,面试官继续提示 is_same
    template <class T>
    void print(const T& val) {
        if (std::is_same<T, std::string>::value) {
            std::cout << val.size() << std::endl;
        } else {
            std::cout << val << std::endl;
        }
    }
  • 实现一个函数, 找到数组的最大值和第二大的值。

  • 实现一个函数,找到里面出现次数最多和第二多的两个数,其中数组类型为vector<unsigned short>

  • 大数相加:实现一个函数, 输出两个字符串数值相加的结果。

  • 提问环节

总结

一早上连续面了两面,二面面了一个半小时,好累。佩服那些连续三面的同学。

隔了一周,hr打电话过来直接沟通offer了,没有hr面。我看牛客上,大家都有hr面,甚至有的同学还有第三轮技术面,所以我觉得这次面试有点迷,运气也太好了,感觉像捡了一个offer。

基本上都是问C++基础的面试风格还是第一次碰到,自我感觉表现还行。面试过程中也发现也几个C++基础理解上的问题,所以收获还是蛮大的。

#快手科技##快手##面经##C++工程师##实习#
全部评论
请问一下,您一面第3个问题是如何回答的啊,求指导。
1 回复
分享
发布于 2020-06-04 13:47
恭喜楼主
点赞 回复
分享
发布于 2020-04-28 00:06
联想
校招火热招聘中
官网直投
应该是临时变量在执行完语句后生命周期结束,返回的临时string被析构,s指针失效了吧。
点赞 回复
分享
发布于 2020-05-02 20:37
lz是base哪里的?
点赞 回复
分享
发布于 2020-05-09 20:41

相关推荐

7 69 评论
分享
牛客网
牛客企业服务