抖音电商,提前批offer!

d55350a9016e088fdba58112e4a4e818.jpeg

南京夫子庙茶颜悦色店 摄于2023.8.27

小伙伴们大家好,我是阿秀。

互联网圈有个梗就是"两大码农工厂:南华科、北北邮",就是说这两所高校的毕业生从事互联网工作的特别多,北邮虽然是211,但在互联网圈子里比很多985学校的牌子都好使,一些互联网公司甚至有北邮帮的说法,你的组长甚至leader搞不好都是你的往届学长a2e7a4704b2ee51353cbbc91b93862d6.png

以前就聊过不建议普通人随便去提前批随便面试这个话题:再次认真聊一聊,为什么我建议你不要随大流去参加提前批?,但北邮本硕的学历背景 + 2段大厂实习在手,肯定不是普通人了,这个含金量还是很够的,加上后台有人私信留言问有没有提前批上岸的经验,今天就来分享一下一位师弟的提前批上岸面经。

抖音电商面试一共是三轮技术面+一轮HR面,一共超过 40 个问题,我系统整理了一遍,并将其中一些比较不错的问题,摘录到了自己开发的网站上。

64d5c1833216612f99a4321253e09b8b.png

InterviewGuide大厂面试真题网站:https://top.interviewguide.cn

今天把师弟的三轮技术面经按照科目分享一下其中的编程语言和算法类的问题,计算机基础知识问题考察明天再发,因为篇幅太长了,一次发估计很多人都看不完,希望这些内容能对大家有帮助。

以下是这位师弟的面经以及部分参考答案:


大家好,应秀哥邀请,我来分享一下自己的面经。

简单介绍一下自己的背景,北邮计算机本硕,目前研二在读,以前本科毕业后gab过一年,工作一年后又来读研了,目前B站+百度分别实习了三个月,我本来打算在B站一直实习下去的,但后来请教了秀哥,秀哥建议我换一家体量更大的公司继续实习,两段实习还是比一家强,后来就跑去百度实习了。

自己能在提前批拿到offer也没想到,原本以为自己是直接挂的,但没想到上岸了,最开始是不打算找提前批的,但秀哥建议我去试试,不要浪费自己的学历背景+实习经历,我就像被打了鸡血一样就去试了。

可能是踩了狗屎运,居然上岸了。

3a7db6b90462d1bd6b64ce17cb7ec533.png

下面是我的面经,我是C++/Golang双语言技术栈,其实我最开始是学习C++的,后来在B站实习时接触到Go语言,后来就学了Go语言,变成双语言技术栈了。

C++

1、问:看你又会C++又会Golang,哪门语言了解的多一些?

:主要是C++,Go是在B站实习期间学习的,当时主要是为了做业务,很多细节都没怎么用心学,后面才慢慢补上的。

2、问:如何学习C++的?看过哪些书?

:主要是《C++ Primer 5th》、《Effective C++》、《More Effective C++》、《深度探索C++对象模型》、《ST源码剖析》以及《C++并发编程实践》,主要是这几本书。

3、问:move语义了解吗?有什么作用?

:move语义是一种高效的资源转移机制,实现移动语义,可以帮助我们避免不必要的拷贝操作,提高程序性能,显著提高效率。

阿秀补充

1、std::move的使用场景

当需要将资源从一个对象转移到另一个对象时,可以使用std::move。例如,在容器中移动元素、在算法中交换数据等。需要注意的是,只有可移动的对象才能使用移动语义,否则可能导致未定义行为。

2、避免不必要的拷贝

使用移动语义可以避免不必要的拷贝操作,从而提高性能。例如,在复制一个大型对象时,如果使用移动语义,只需要进行一次内存分配和一次指针拷贝,而不需要进行多次拷贝操作。

3、以下是C++中move语义的一些关键点:

移动构造函数:std::move可以将一个左值转换为右值引用,从而实现资源的转移。例如:

class MyClass {
public:
   MyClass(int x) : data(new int(x)) {}
   // 移动构造函数
   MyClass(MyClass&& other) noexcept : data(other.data) {
       other.data = nullptr;
   }
private:
   int* data;
};

移动赋值运算符:std::move也可以用于将一个对象的资源转移到另一个对象。例如:

MyClass a(1);
MyClass b(std::move(a)); // 使用std::move实现移动赋值

4、问:说一下程序的内存分区?

:从高地址和低地址分别向中间拓展,由上而下分别是堆、栈、自由存储区、全局/静态存储区、常量存储区和代码区。

阿秀补充

d26d7f5d1cea91dbafa05aa7d5805c2e.png

:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限

:就是那些由 new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收

自由存储区:如果说堆是操作系统维护的一块内存,那么自由存储区就是C++中通过new和delete动态分配和释放对象的抽象概念。需要注意的是,自由存储区和堆比较像,但不等价。

全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量和静态变量又分为初始化的和未初始化的,在C++里面没有这个区分了,它们共同占用同一块内存区,在该区定义的变量若没有初始化,则会被自动初始化,例如int型变量自动初始为0。

常量存储区:这是一块比较特殊的存储区,这里面存放的是常量,不允许修改

代码区:存放函数体的二进制代码

5、问:C++11中的新特性说说?

:老八股文了balabalab

阿秀补充

C++11新特性主要有:

  • nullptr替代 NULL

  • 引入了 auto 和 decltype 这两个关键字实现了类型推导

  • 基于范围的 for 循环for(auto& i : res){}

  • 类和结构体的中初始化列表

  • Lambda 表达式(匿名函数)

  • std::forward_list(单向链表)

  • 右值引用和move语义

  • 无序容器和正则表达式

  • 成员变量默认初始化

  • 智能指针等

6、问:auto是怎么实现识别自动类型的?

:不太清楚,回答了个“只知道是根据初始化表达式自动推导出变量的类型”的

阿秀补充

auto在C++11中是一种新的类型说明符,它可以根据初始化表达式自动推导出变量的类型。

auto的工作原理是:

  • 编译器看到auto,会查看初始化表达式的类型,并将该类型作为auto变量的类型。

  • 如果初始化表达式的类型可以确定,则使用该类型。如果初始化表达式包含了多个类型,则使用与初始化表达式兼容的共同类型。

  • 如果无法确定类型,则报错。

例如:

cpp auto x = 5; // x是int类型 
auto y = 1.5; // y是double类型 
auto z = x + y; // z是double类型 

std::vector<int> 
vec; auto itr = vec.begin(); // itr是std::vector<int>::iterator类型

在上面例子中,编译器通过查看初始化表达式的类型,推导出auto变量的实际类型。

需要注意的是,auto只在声明时确定一次变量类型,之后变量类型不再改变,并且auto变量必须初始化,才能推导出类型。

7、问:模板是怎么实现转化成不同类型的?

:不懂呜呜呜

阿秀补充

模板是一种通用的编程技术,可以用于实现泛型编程,即编写一个通用的类或函数,可以适用于多种不同的数据类型。

在C++中,模板是通过模板参数来实现的。模板参数可以是一个类型、一个整数或者一个枚举类型。在使用模板时,需要为每个要使用的类型提供一个对应的模板参数。

参考代码:

template <typename T>
class MyClass {
public:
    void setValue(T value) {
        this->value = value;
    }

    T getValue() const {
        return value;
    }

private:
    T value;
};

8、问:push_back和emplace_back的区别?

:这个我知道,emplace_back通常在性能上优于push_back,可以避免不必要的复制或移动操作。

  • push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素)

  • emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。

9、问:刚才你说看过C++并发编程实战,那写个题吧,很简单的,创建三个线程,依次打印1到100.

:很常见的题,用thread就可以做,5分钟搞定!

阿秀补充

#include <iostream>
#include <thread>
using namespace std;

void print_nums(int start, int end) {
    for (int i = start; i <= end; i++) {
        cout << i << " ";
    }
    cout << endl;
}

int main() {
    thread t1(print_nums, 1, 25); // 创建第一个线程,打印1到25
    thread t2(print_nums, 26, 50); // 创建第二个线程,打印26到50
    thread t3(print_nums, 51, 100); // 创建第三个线程,打印51到100

    t1.join(); // 等待第一个线程执行完毕
    t2.join(); // 等待第二个线程执行完毕
    t3.join(); // 等待第三个线程执行完毕

    return 0;
}

Golang

10、问:看你在B站实习用的是Go语言是吧?怎么学的?

:我是直接看的github上的go语言极简入门,后来又看了《Go语言设计与实现》

11、问:问你一个简单的问题,你应该知道map是无序的,每次迭代map的顺序可能不同。如果需要按特定顺序遍历map,应该怎么做呢?

:可以考虑借助切片来做,将键保存在切片中,然后把切片排序,最后根据排序后的顺序遍历map访问对应的值,这样可以达到目的。

阿秀补充

package main

import (
 "fmt"
 "sort"
)

func main() {
 m := map[string]int{
  "b": 2,
  "a": 1,
  "c": 3,
 }

 keys := make([]string, 0, len(m))
 for k := range m {
  keys = append(keys, k)
 }

 sort.Strings(keys)

 for _, k := range keys {
  fmt.Println(k, m[k])
 }
}

12、问:你刚才提到了排序是吧,一般用sort函数,其中的排序函数是什么排序?

:内容os:这个我还真研究过。应该是快排、插入排序、堆排这三种,具体来说sort()源码中采用的是一种叫做IntroSort内省式排序的混合式排序算法,简单来说就是数据量达到一定规模就用快排或者堆排,没达到就用插入排序,但这个规模量我记不清了,大概是这个意思;快排和堆排的取舍则是根据最新递归深度的阈值来判断的。

阿秀补充

IntroSort内省式排序的混合式排序算法,

  • 第一步,首先进行判断排序的元素个数是否大于stl_threshold,stl_threshold是一个常量值是16,意思就是说我传入的元素规模小于我们的16的时候直接采用插入排序。

(为什么用插入排序?因为插入排序在面对“几近排序”的序列时,表现更好,而快排是通过递归实现的,会为了极小的子序列产生很多的递归调用在区间长度小的时候经常不如插入排序效率高)

  • 第二步,如果说我们的元素规模大于16,那就需要去判断如果是不是能采用快速排序,怎么判断呢?快排是使用递归来实现的,如果说我们进行判断我们的递归深度有没有到达递归深度的限制阈值2*lg(n),如果递归深度没达到阈值就使用快速排序来进行排序

  • 第三步,如果说大于我们的最深递归深度阈值的话,这个时候说明快排复杂度退化了(比如很不巧基准元素多次选取到了当前区间中最小或最大的元素。这种情况下,每次划分只能将区间缩小1个元素,造成递归深度过深),就会采用我们的堆排序,堆排序是可以保证稳定O(nlogn)的时间复杂度的。

13、问:如何移除切片中的数据?你有哪些方式?

:切片的切片操作或者append都可以。

阿秀补充

append这个简单,切片的切片其实就是使用切片的切片操作将切片分为两部分,将想要移除的元素从中间移除即可,比如我想移除第三个元素:

package main

import "fmt"

func main() {
    numbers := []int{1, 2, 3, 4, 5}
    index := 2
    numbers = append(numbers[:index], numbers[index+1:]...)
    fmt.Println(numbers) // 输出: [1 2 4 5]
}

算法

一共考察了4道题,一面2道,二面2道,三面没考,有剑指offer原题,也有力扣原题和变形题,都不算难,感觉刷力扣刷 500+ 以上都能顺利做出来。

盛最多水的容器:https://top.interviewguide.cn/issue/665

输出二叉树的左视图:https://top.interviewguide.cn/issue/697

链表判断有没有环:https://top.interviewguide.cn/issue/715

二叉树转双向链表:https://top.interviewguide.cn/issue/720

实习/项目

:介绍下你的两段实习经历?

:有什么收获?

阿秀2年来一直在做的一件事

这里也给自己的知识星球,也就是学习圈打个广告,坚持这件事情已经快2 年时间了。

前年和去年分享的很多校招上岸经验也都是出自阿秀的学习圈中的往届上岸人,阿秀的学习圈中置顶帖的「知识图谱」和「精华区」(如下图)中有很多计算机大学本科&研究生学习以及校招的内容和问题,多看看这些能够帮你走的更稳、更顺、更平坦。

后续也会在自己组建的阿秀的学习圈中分享一些社招跳槽找工作的经验,都是自己一路走过来的经验。

b92a7ace3ab33ac3118238a16a5f1186.png星球里的精华区、知识图谱以及资源沉淀

一个人踽踽独行不如结伴而行,以后会继续在星球笔耕不辍,输出一些有价值的内容format,png

欢迎点击左下角阅读原文详细了解,这可能是你求职路上性价比最高的一次点击!

前段时间自己也开发了一个互联网大厂真题面试解析网站,比如我想查一下行业为互联网,公司为字节跳动,考察岗位为后端,考察时间为最近一年之类的面试题有哪些?

31e7c46d0f190d7c54899fa8773f1bb9.png

《InterviewGuide》大厂面试真题网站:https://top.interviewguide.cn/

已经有不少小伙伴遇到原题了,具体可以看下链接:

2023年7月字节跳动后端研发岗面试考察题目Top10

局部性原理还真有用!

后面还会继续开发其余星球用户专属功能,比如模拟面试以及题目收藏、甚至是真题下载打印功能等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/99045.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt5升级到Qt6分步迁移教程

Qt框架的一个新的长期支持版本6.5最近发布。它为以前的版本引入了许多修复、改进和新功能。有些可能对您的应用程序有用&#xff08;如果不是现在&#xff0c;可能会在将来&#xff09;&#xff0c;因此最好将应用程序迁移到最新版本的框架。 仍然有许多应用程序仍在使用Qt 5&…

瑞芯微:基于RK3568得人脸朝向检测

驾驶员监控系统是基于驾驶员面部图像处理来研究驾驶员状态的实时系统。首先挖掘出人在疲劳状态下的表情特征&#xff0c;然后将这些定性的表情特征进行量化&#xff0c;提取出面部特征点及特征指标作为判断依据&#xff0c;再结合实验数据总结出基于这些参数的识别方法&#xf…

git clone 报SSL证书问题

git命令下运行 git config --global http.sslVerify false 然后再进行重新clone代码

Web安全——信息收集下篇

Web安全 一、网络空间搜索引擎二、扫描敏感目录/文件1、御剑2、7kbstorm3、bbscan4、dirmap5、dirsearch6、gobuster7、网站文件 三、扫描网页备份四、网站头信息收集五、敏感文件搜索1、GitHub搜索2、Google-hacking3、wooyun漏洞库4、网盘搜索5、社工库6、网站注册信息7、js敏…

登录校验-Filter-登录校验过滤器

目录 思路 登录校验Filter-流程 步骤 流程图 登录校验Filter-代码 过滤器类 工具类 测试登录 登录接口功能请求 其他接口功能请求 前后端联调 思路 前端访问登录接口&#xff0c;登陆成功后&#xff0c;服务端会生成一个JWT令牌&#xff0c;并返回给前端&#xff0…

【YonBuilder课堂】“入职申请单”的创建流程

YonBuilder是面向企业组织和个人开发者的低代码开发平台&#xff0c;实现可视化、低代码/无代码开发。提供以元数据驱动、点击拖拽自动化代码生成和多端编译的技术&#xff0c;与开放平台、连接集成平台、DevOps平台无缝整合&#xff0c;形成覆盖业务建模&#xff0c;开发、集成…

模糊测试面面观 | 模糊测试是如何发现异常情况的?

协议模糊测试是一种用于评估通信协议、文件格式和API实现系统安全性和稳定性的关键技术。在模糊测试过程中&#xff0c;监视器扮演着关键角色&#xff0c;它们能够捕获异常情况、错误响应、资源利用等&#xff0c;为测试人员提供有价值的信息&#xff0c;有助于发现潜在漏洞和问…

MySQL----索引

一、索引的概念 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于c语言的链表通过指针指向数据记录的内存地址&#xff09;。使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找到该…

Kubernetes对象深入学习之五:TypeMeta无效之谜

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Kubernetes对象深入学习之五》系列的第五篇&#xff0c;从前文的分析也能看出&#xff0c;代表对象类型的schema.ObjectKind&#xff0c;于…

Shell编程之流程控制

目录 if判断 case语句 for循环 while循环 if判断 语法&#xff1a; if [ 条件判断表达式 ] then 程序 elif [ 条件判断表达式 ] then 程序 else 程序 fi 注意&#xff1a; [ 条件判断表达式 ]&#xff0c;中括号和条件判断表达式之间必须有空格。if&#xff0c;elif…

无涯教程-机器学习 - 矩阵图函数

相关性是有关两个变量之间变化的指示&#xff0c;在前面的章节中&#xff0c;无涯教程讨论了Pearson的相关系数以及相关的重要性&#xff0c;可以绘制相关矩阵以显示哪个变量相对于另一个变量具有较高或较低的相关性。 在以下示例中&#xff0c;Python脚本将为Pima印度糖尿病数…

Servlet学习总结(Request请求与转发,Response响应,Servlet生命周期、体系结构、执行流程等...)

Override 是Java中的注解&#xff08;Annotation&#xff09;&#xff0c;它用于告诉编译器该方法是覆盖&#xff08;重写&#xff09;父类中的方法。当我们使用Override注解时&#xff0c;编译器会检查当前方法是否正确地覆盖了父类中的方法&#xff0c;如果没有覆盖成功&…

Elasticsearch 集成---Spark Streaming 框架集成

一.Spark Streaming 框架介绍 Spark Streaming 是 Spark core API 的扩展&#xff0c;支持实时数据流的处理&#xff0c;并且具有可扩展&#xff0c; 高吞吐量&#xff0c;容错的特点。 数据可以从许多来源获取&#xff0c;如 Kafka &#xff0c; Flume &#xff0c; Kin…

Scala集合继承体系图

Scala集合简介 1&#xff09; Scala 的集合有三大类&#xff1a;序列 Seq、集Set、映射 Map&#xff0c;所有的集合都扩展自 Iterable特质。 2&#xff09; 对于几乎所有的集合类&#xff0c;Scala 都同时提供了可变和不可变的版本&#xff0c;分别位于以下两个包 不可变集合…

[C++网络协议] I/O复用

具有代表性的并发服务器端实现模型和方法&#xff1a; 多进程服务器&#xff1a;通过创建多个进程提供服务。 多路复用服务器&#xff1a;通过捆绑并统一管理I/O对象提供服务。✔ 多线程服务器&#xff1a;通过生成与客户端等量的线程提供服务。 目录 1. I/O复用 2. select函…

Vue:关于声明式导航中的 跳转、高亮、以及两个类名的定制

声明式导航-导航链接 文章目录 声明式导航-导航链接router-link的两大特点&#xff08;能跳转、能高亮&#xff09;声明式导航-两个类名定制两个高亮类名 实现导航高亮&#xff0c;实现方式其实&#xff0c;css&#xff0c;JavaScript , Vue ,都可以实现。其实关于路由导航&…

Android Studio 的github 工程克隆

上文介绍了Android Studio 里的"Git 建立和简单操作。本文介绍从github 上的工程fork 和clone到本地&#xff0c;然后学习和改进。 本文参考 https://learntodroid.com/how-to-use-git-and-github-in-android-studio/ 克隆clone Github 仓库&#xff1a; 先 Fork 你选择…

stm32之25.FLASH闪存

打开标准库 源码--- int main(void) {uint32_t d;Led_init();key_init();/* 初始化串口1波特率为115200bps&#xff0c;若发送/接收数据有乱码&#xff0c;请检查PLL */usart1_init(115200);printf("this is flash test\r\n");/* 解锁FLASH&#xff08;闪存&#xf…

跨境做独立站,如何低成本引流?你的流量密码在这

大家都知道&#xff0c;海外的消费习惯与国内不同&#xff0c;独立站一向是海外消费者的最喜欢的购物方式之一&#xff0c;这也吸引了许多跨境商家开设独立站。 独立站不同于其他的第三方平台&#xff0c;其他平台可以靠平台自身流量来获得转化&#xff0c;而独立站本身没有流…

java八股文面试[多线程]——ThreadLocal底层原理和使用场景

源码分析&#xff1a; ThreadLocal中定义了ThreadLocalMap静态内部类&#xff0c;该内部类中又定义了Entry内部类。 ThreadLocalMap定了 Entry数组。 Set方法&#xff1a; Get方法&#xff1a; Thread中定义了两个ThreaLocalMap成员变量&#xff1a; Spring使用ThreadLocal解…