抖音电商,提前批offer!

news2024/12/23 5:00:24

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

局部性原理还真有用!

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5分钟看懂物料清单(BOM)的用途、类型及管理

管理物料可以提高制造和供应链流程的效率&#xff0c;例如生产、物流、调度、产品成本核算和库存计划。企业通常使用物料清单作为制造产品的组件、材料和流程的中央记录。 物料清单&#xff08;BOM&#xff09;是构建、制造或维修产品或服务所需的原材料、组件和说明的详细列表…

K8S:K8S自动化运维容器Docker集群

文章目录 一.k8s概述1.k8s是什么2.为什么要用K8S3.作用及功能4.k8s容器集群管理系统 二.K8S的特性1.弹性伸缩2.自我修复3.服务发现和复制均衡4.自动发布和回滚5.集中化配置管理和秘钥管理6.存储编排7.任务批量处理运行 三.K8S的集群架构四.K8S的核心组件1.Master组件&#xff0…

水土保持技术教程

详情点击公众号链接&#xff1a;新《生产建设项目水土保持方案技术审查要点》要求下全流程水土保持实践技术应用教程 目标 1、水土保持常用的主要法律法规、部委规章、规范性文件及技术规范与标准&#xff1b; 2、水土保持方案、监测及验收工作开展的流程&#xff1b; 3、水…

同一台电脑测.Net和Mono平台浮点运算的差异

float speed 0.1f;float distance 2.0f;long needTime (long)(distance / speed);Log.Debug($"needTime{needTime}"); 结果&#xff1a; .Net平台算出20 Mono平台算出19

尚硅谷SpringMVC (5-8)

五、域对象共享数据 1、使用ServletAPI向request域对象共享数据 首页&#xff1a; Controller public class TestController {RequestMapping("/")public String index(){return "index";} } <!DOCTYPE html> <html lang"en" xmln…

桌面网络存储迎来新浪潮!龙蜥社区联合龙芯首发优龙桌面网络存储一体机方案

2023 年 8 月 19 日&#xff0c;龙蜥社区合作伙伴单位南京龙众创芯电子科技有限公司(以下简称“龙众创芯“)与龙蜥社区理事单位龙芯中科(武汉)技术有限公司&#xff08;以下简称“龙芯”&#xff09;&#xff0c;联合可道云、上海七朵信息等多家生态伙伴&#xff0c;以及龙芯开…

IntelliJ IDEA快捷键大全 + 动图演示,建议收藏!

本文参考了 IntelliJ IDEA 的官网&#xff0c;列举了IntelliJ IDEA&#xff08;Windows 版&#xff09;的所有快捷键。并在此基础上&#xff0c;为 90% 以上的快捷键提供了动图演示&#xff0c;能够直观的看到操作效果。 该快捷键共分 16 种&#xff0c;可以方便的按各类查找自…

【二维偏序】CF Edu10 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long long #define lowbit(x) (x & (-x))using i64 long long;constexpr int N 2e6 10; constexpr int M 2e6 10; constexpr int P 2e6; c…

美国纽扣电池/锂电池产品UL4200A标准解析

近来&#xff0c;部分ANSI/UL标准&#xff08;如UL1082、UL982、UL1026、UL1081等&#xff09;对含有纽扣锂电池的产品新增了UL4200A的要求。对于具体生效日期&#xff0c;请注意后续各终端产品标准新版本更新通告。 1. 适用产品 安装有直径 ≤32mm&#xff0c;且直径大于高度的…

如何在不重新安装的情况下将操作系统迁移到新硬盘?

通常情况下&#xff0c;当你的硬盘损坏或文件过多时&#xff0c;电脑会变得缓慢且卡顿。这时&#xff0c;你可能会被建议更换为一块更好的新硬盘。 ​ 在比较HDD和SSD之后&#xff0c;许多用户更愿意选择SSD作为他们的新硬盘&#xff0c;因为SSD比HDD更稳定且运行更安…

平面设计师都在用的6个免费素材网站

常见的设计素材网站太多了&#xff0c;不是要会员就是要花钱买&#xff0c;今天给大家推荐几个可以免费下载的设计素材网站&#xff0c;有需要的朋友赶紧马住了。 1、菜鸟图库 菜鸟图库-免费设计素材下载菜鸟图库汇集了各种免费高清广告图片设计、电商淘宝、企业办公模板、视频…

python爬取bilibili,下载视频

一. 内容简介 python爬取bilibili&#xff0c;下载视频 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接&#xff1a;https://pan.baidu.com/s/1WuXTso_iltLlnrLffi1kYQ?pwd1234 三.主要流程 3.1 下载单个视频 代码 import requests impor…

Springboot快速搭建Web API项目

内容概述 SpringBoot最常见得用途就是web api项目。 本文介绍使用自动配置功能&#xff0c;通过最简洁的pom依赖&#xff0c;快速搭建一个示例项目。 实现的功能为&#xff1a;接收http请求并返回json格式的数据。 一、配置pom.xml依赖 1.引入springweb依赖 <dependenc…

小米手机便签怎么导出到华为mate60Pro手机上?

华为mate60Pro手机于2023年8月29日发布了先锋计划&#xff0c;有不少网友都抢到了这款新机。而有一些网友表示自己在换手机之前遇到了问题&#xff0c;这就是之前使用的手机是小米&#xff0c;所以需要把重要的图片、短信、通讯录、便签等数据导出到新的手机上&#xff0c;但是…

【算法日志】动态规划刷题:股票买卖问题(day41)

代码随想录刷题60Day 目录 前言 买卖股票的最佳时机1 买卖股票的最佳时机2 买卖股票的最佳时机3 买卖股票的最佳时机4 前言 本日着重于多状态问题的处理&#xff0c;各状态之间会有一定联系&#xff0c;状态转移方程将不再局限一个。 买卖股票的最佳时机1 int maxProfit(…

基于Vue前端框架构建BI应用程序

一、什么是Vue&#xff1f; Vue&#xff08;Vue.js&#xff09;是一个轻量级、高性能、可组件化的MVVM库。简而言之&#xff0c;是一个构建数据驱动的web界面的渐进式框架。它采用MVVM思想&#xff0c;通过数据双向绑定实现数据的动态渲染&#xff0c;同时也支持组件化的开发方…

Ansible学习笔记15

1、roles&#xff1a;&#xff08;难点&#xff09; roles介绍&#xff1a; roles&#xff08;角色&#xff09;&#xff1a;就是通过分别将variables&#xff0c;tasks及handlers等放置于单独的目录中&#xff0c;并可以便捷地调用他们的一种机制。 假设我们要写一个playbo…

RuntimeError: scatter_cpu_(): Expected self.dtype to be equal to src.dtype

1. 问题描述 如下图&#xff0c;输入scatter_时报错&#xff01; 2. 报错原因 查阅资料发现是因为要填充的value与要被填充的tensor类型不同&#xff01;如下图 3. 解决办法 将其转换成一样的类型即可&#xff0c;如下图&#xff0c;测试没有报错&#xff1a;

RecyclerView回收复用分析

作者&#xff1a;Calculus_小王 本文从ViewTraversals三大流程和事件分发讲起&#xff0c;结合使用和体验&#xff0c;重点剖析RecyclerView的回收复用机制。全篇将以LinearLayoutManager为例&#xff0c;围绕RecyclerView.Adapter日常重写的几个经典方法展开&#xff0c;讲清R…

文献阅读:Deep Learning Enabled Semantic Communication Systems

目录 论文简介关于文章内容的总结引申出不理解的问题 论文简介 作者 Huiqiang Xie Zhijin Qin Geoffrey Ye Li Biing-Hwang Juang 发表期刊or会议 《IEEE TRANSACTIONS ON SIGNAL PROCESSING》 发表时间 2021.4 这篇论文由《Deep Learning based Semantic Communications: A…