字节跳动-客户端开发工程师-产品研发和工程架构部职位的面试(一面)

一面:1h

2020-05-08
【考察内容】​
我们主要考察通用型的业务问题和过往的项目经历​
价值观和软性技能也是我们选择人才的重要因素​

专业知识

  • 自我介绍?
    balabala
  • 项目介绍中的crush or debug?
    没有准备过,说了一些服务器的调试;然后讲了在项目中没有遇到过crush,但在C++刷算法题中遇到过内存泄露(引入自己熟悉的C++领域)
  • 内存泄露的原因?
    指针使用后没有释放其在内存中占用的地址
  • C++11的新特性是否了解?
    智能指针,它就可以很好地解决内存泄露的问题
  • 智能指针都有哪些?
    shared_ptr, unique_ptr, weak_ptr
  • 智能指针如何释放内存的?
    应该是调用析构函数的
  • 那智能指针是如何知道何时该释放内存的?
    自己也不是很清楚,随口说是根据生命周期判断
  • 那如果一个对象中有智能指针,另一个对象一直在持有该对象,则当前的智能指针一直都在生命周期内,应该如何知道何时释放内存?
    我想了好久,回答是不是根据一个内部的计时器判断(面试官说:很接近了,是一个状态)
    然后又根据状态的提示,想到是不是跟进程的挂起?执行?这些状态有关???
    (其实面试官是想问如何实现智能指针何时释放内存,面试官说设置一个状态变量,被持有时做标记,不被持有时取消标记即可,自己一直理解的是智能指针释放内存的原理是什么)
  • sizeof与strlen的区别
    我回答的是sizeof得到的是开辟的空间大小,strlen是获得从首地址到’\0’的长度;sizeof求数组长度需要除上基本类型所占的字节数(其实sizeof是个运算符,strlen是个函数;前者返回对象类型在内存中占的字节数,后者返回字符串长度)
  • 传指针和传引用的区别
    指针会有一块独自的地址,引用只是变量的别名,和原始变量共用一块地址
    指针大小是4字节,引用的大小和原始变量大小一致
    指针可以使用多级指针,引用只能一级
  • 形参只是个基础变量,会是什么情况
    只是个值传递,子函数里只不过是又申请了一块地址存放变量,外面无法获取到,也不能修改外面的值
  • 熟悉的进程通信的方式有哪些
    管道,共享存储,消息缓存队列

算法(面试官看着手撕代码)

有点像做数学题,老师在旁边看着的感觉

  • 算法:给出一个二叉树,求出该二叉树的左视图
    先说思路:层序遍历二叉树,输出每一层最左侧的结点
    然后就是手撕层序遍历,热身的题目
  • 智力问答题目:一个圆形桌子,两个人往桌子上放硬币,不能重叠放置,当先手的人放置完后,后手的人不能再放置,说明先手的赢了,问如何保证自己获胜
    一开始我先问了问对桌子和硬币大小有什么规定么?(面试官说没有)
    然后我在纸上画了画,说让对方先手放置,我在他放置硬币的对称位置放置就能保证自己获胜
  • 算法:给出一组数据表示股票在这段时间内,每天的价格,经过有限次买卖,求出获得的最大利润
    例如: 7,1,5,3,6,4
    1买入,5卖出,盈利4
    3买入,6卖出,盈利3
    最大盈利是7
    一开始自己的想法有点暴力,还打算排序,被面试官制止,面试官提醒是站在上帝视角看待问题的,然后自己有了点思路,发现不断在相邻两天买进卖出,求出所有差价的数组,然后正数加和,负数舍弃即可
    差价数组:-6,4,-2,3,-2
    然后完成代码后,跑了一下第一个用例就结束了
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
#include 
using namespace std;
int n;
int price[1005];
int main() {
    int buy = 0, sell = 0;
    scanf("%d", &n);
    for(int i = 0; i < n; ++i)
    {
        scanf("%d", &price[i]);
    }
    buy = price[0];
    int result = 0;
    for(int i = 1; i < n; ++i)
    {
        sell = price[i];
        int temp = sell - buy;
        if(temp > 0)
            result += temp;
        buy = sell;
    }
    printf("%d\n", result);
}

整体一面还是比想象中要轻松的,面试官人也很nice

你可能感兴趣的:(面试,C++,c++,算法,面试,数据结构)