快手C++一面-面经总结

1.括号匹配:(暂且以20. 有效的括号)

#include <iostream>
#include <stack>
#include <unordered_map>

using namespace std;

bool isValid(string s) {
    stack<char> stk; // 用于存放左括号的栈
    unordered_map<char, char> mappings = {
        {')', '('},
        {'}', '{'},
        {']', '['}
    }; // 用于存放右括号与其对应的左括号的映射关系

    // 遍历输入字符串
    for (char c : s) {
        // 如果是左括号,压入栈中
        if (c == '(' || c == '{' || c == '[') {
            stk.push(c);
        } else {
            // 如果是右括号
            // 判断栈是否为空或者栈顶元素是否与当前右括号匹配
            if (stk.empty() || stk.top() != mappings[c]) {
                return false; // 不匹配,返回 false
            }
            stk.pop(); // 匹配,将栈顶元素出栈
        }
    }

    // 最后判断栈是否为空,如果为空则说明所有括号都匹配
    return stk.empty();
}

int main() {
    string s = "{[()]}";
    cout << isValid(s) << endl; // 输出 1,表示有效

    s = "{[(])}";
    cout << isValid(s) << endl; // 输出 0,表示无效

    return 0;
}

2.数字字符串分割为网络ip(以93. 复原 IP 地址)

1.面向对象三特性:

封装:数据成员和成员函数捆绑。
继承:基类派生类 单继承 多继承
多态:静态多态(模板 重载) 动态多态(虚函数 动态绑定)

2.一个空类会自动生成哪几个函数?

默认构造函数
拷贝构造函数
拷贝赋值运算符
默认析构函数

3、哪些函数不能是虚函数?

构造函数不能,因为构造的时候还没有虚函数表
static修饰的静态成员函数不能,因为没有实例
inline内联函数不能,虚函数往往非内联
模板函数的具体版本不能,因为不靠继承
friend友元函数不能,这是外部定义的,不靠类对象调用。

4、纯虚函数是什么?

虚函数的声明后面加上=0 就是纯虚函数
纯虚函数就是为了–创建抽象基类

5、如何防止内存泄漏?

1.使用智能指针
2.遵循RAII
3.new和delete匹配
4.可以使用STL 也会自动管理内存
5.已经出现情况 可以AddressSanitizer Valgrind 或者vs自带的

6、raii?

RAII是资源获取就初始化,把资源的获取和释放绑定到对象的生命周期内,利用对象的构造函数和析构函数来管理资源。防止资源泄漏。

内存分配、文件打开、锁定线程都是资源的获取。

自动化资源管理、用构造函数和析构函数来管理资源。
不需要再手动调用释放函数。

7、shared,weak,unique智能指针的点基本都问了?

shared_ptr:共享所有权的智能指针,多个shared可以指向相同的对象,维护一个引用计数,一个控制块

本质都是模板类

控制块:shared_ptr 通常管理一个单独的控制块,该块包含了:
1.资源的指针(即被 shared_ptr 管理的对象)。
2.引用计数(用于记录有多少 shared_ptr 指向同一资源)。
3.弱引用计数(用于 std::weak_ptr)。
4.删除器(自定义删除方式)。

引用计数就是整型的变量 atomic保证线程安全性(原子操作保障)
原子操作能够确保在多个线程同时修改引用计数时不会产生竞争条件,防止引用计数错误。

引用计数如何管理资源的?
在这个模板类的析构函数中,如果创建新的shared指向同一个资源的时候,引用计数+1,但是离开作用域或者销毁,就会-1.当等于0的时候,就释放资源,销毁控制块。

weak_ptr:与shared_ptr配合使用,不增加引用计数的智能指针,解决循环引用的问题。用于观察。

auto_ptr:c++98用的,但是C++17直接被移除了,因为太烂了。不好用,复制还会转移所有权。

unique_ptr:1.独占所有权 不能赋值给另一个
2.但是支持移动语义 可以把所有权让给另一个 用move
3.自动释放资源 RAII (这个是智能指针都要说的)
4.效率高 只有一个指针 也没有引用计数 轻量

底层实现:
就是个模板类,可以管理动态分配的对象,template的typename指定管理的资源的类型。
构造函数时默认构造函数,析构函数来确保他离开作用域就删除器。
禁止拷贝构造 禁止拷贝赋值运算符

unique_ptr(const unique_ptr&) = delete; // 禁止拷贝构造
unique_ptr& operator=(const unique_ptr&) = delete; // 禁止拷贝赋值

但是支持移动语义,可以移动构造 可以移动赋值 move(从另一个 unique_ptr 中“偷走”指针,将原来的指针置为空。)

8、map与unordered_map区别?

map是红黑树,按照排序规则插入合适位置。查找插入删除都是logn
平衡二叉树内存开销比较大,适用于需要排序,或者范围查询。

unorderedmap是哈希表,没有顺序,查找、插入删除都是o1
最坏的情况下有可能on 相对简单 对顺序不关心 经常查找插入删除。

9、计网四层模型与对应的协议?

应用层:SMTP HTTP HTTPS FTP DNS
传输层:TCP UDP 连靠刘墉露营
网络层:IP ICMP ARP
网络接口层:WIFI Ethernet PPP MAC

10、点对点和端到端的区别?

点对点就是P2P 两个直接通信,没有什么路由器,交换机。
通常在数据链路层和物理层
端到端E2E是两个终端进行了通信,涵盖了整个路径。
通常在传输层和应用层

11、ARP怎么工作的?

IP-MAC
就是广播包,一直目标的IP地址,求目标的MAC地址
对应的ip地址的发回包。带着自己的MAC地址

12、tcp三次握手?

第一次握手:client向server发送一个SYN 携带自己的初始化序列号。
第二次握手:server收到,以自己的SYN为应答,把自己的初始化序列号发送回client,并且把client的初始化序列号+1作为ACK返回。
第三次握手:client收到,把server的初始化序列号+1作为ACK发回server。

13、https工作流程?

在这里插入图片描述

14、quic协议知道吗?

google提出的,用于改善基于 TCP 的传输层协议的性能和安全性。
在这里插入图片描述

15.linux的进程通信方式?

消息队列
管道
socket
信号量
共享内存

16.如何查看一个进程监听了什么端口?

netstat
ss

17.io多路复用?

select最早的
poll是对select的改进
epoll

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MatsumotoChrikk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值