字节跳动面试题详解

合并k个有序数组,写代码

Leetcode 23题,是一道Hard题目

字节跳动面试题详解_第1张图片

 

一个整数分解为多个不同的数之和,有几种分法,写代码

这道题也是一道较难的动态规化

 

介绍一下cpp的智能指针

 

std::move了解吗 底层实现什么样的

解释这个先要解释左值和右值

左值(lvalue)与右值(rvalue)

用一句话来概括形容就是:

左值:放在等号左边的值,可以被赋值;

右值:放在等号右边的值,不能被赋值;

比较典型的左值(以下各种运算符均是C++内建):

a

++a

*a

**a

a.m

a->m

a[m]

比较典型的右值(以下各种运算符均是C++内建):

a + b

a++

a && b

a < b

&a

深拷贝与浅拷贝

比如我们有A、B两个对象,里面均有指针指向对应内容,现在A要对B进行拷贝:

深拷贝:A先申请出一片新的空间,完全复制B的内容到新空间中;

浅拷贝:A复制B指针,将自己的指针指向B的内容地址,A、B公用一块内存地址;

所以对于深拷贝,A的修改与B没有关系;对于浅拷贝,A的修改也会在B对象也会被改变。

左值引用与右值引用

左值引用:传统的引用,形如T&;

右值引用:C++11新的数据类型,为了实现移动语义与完美转发所需要而设计出来的新的数据类型,形如T&&;

 

std::move()使用的意义

协助使用者进行浅拷贝,前提条件是拷贝对象需要支持移动赋值(move-assignment)、移动构造(move-constructor)。

//test.cpp
#include   
#include   
int main()
{
    std::map mapA;
    mapA[1] = 1;
    mapA[2] = 2;
    mapA[3] = 3;
    printf("addr A: %x|%x|%x\n", &mapA[1], &mapA[2], &mapA[3]);
 
    std::map mapB = mapA;
    printf("addr B: %x|%x|%x\n", &mapB[1], &mapB[2], &mapB[3]);
 
    mapB[4] = 4;
    printf("addr new: %d|%d\n", mapA[4], mapB[4]);
    return 0;
}

在STL中,这里是一个深拷贝。所以地址是完全不同的。

要进行浅拷贝,使用std::move函数

//test.cpp
#include   
#include   
int main()
{
    std::map mapA;
    mapA[1] = 1;
    mapA[2] = 2;
    mapA[3] = 3;
    printf("addr A: %x|%x|%x\n", &mapA[1], &mapA[2], &mapA[3]);
 
    std::map mapB = std::move(mapA);
    printf("addr B: %x|%x|%x\n", &mapB[1], &mapB[2], &mapB[3]);
 
    mapB[4] = 4;
    printf("addr new: %d|%d\n", mapA[4], mapB[4]);
    return 0;
}

这里是一个浅拷贝

 

 

extern c有什么用

表明变量在定义在另外一个文件中。

给了一段代码,大概是两个分配在栈上的类的对象,第二个实际上是第一个的别名,问会有什么问题。这个类成员有指针,析构函数会delete这个指针,所以出了语句块会析构两次。问怎么解决

rust了解什么

tcp的重传机制了解什么

TCP 可靠传输

1、确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。

tcp的拥塞控制

 

说一下cookie和session

Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一个唯一标识:Session ID。当服务器创建了一个 Session 时,给客户端发送的响应报文就包含了 Set-Cookie 字段,其中有一个名为 sid 的键值对,这个键值对就是 Session ID。客户端收到后就把 Cookie 保存在浏览器中,并且之后发送的请求报文都包含 Session IDHTTP 就是 Session Cookie 这两种方式一起合作来实现跟踪用户状态的,而 Session 用于服务器端,Cookie 用于客户端。
 

你可能感兴趣的:(算法)