字节豆包C++一面-面经总结

news2024/11/17 12:28:14

talk is cheap show me the code

lc206:链表反转:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
    if(head==nullptr||!head->next)return head;
    auto node1=head;
    auto node2=head->next;
    node2=reverseList(node2);
    node1->next->next=node1;
    node1->next=nullptr;
    return node2;
    }
};

lc70爬楼梯进阶,爬楼梯高级进阶:一次可以跳1-n阶台阶

爬楼梯原版:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

原版:

class Solution {
public:
    int climbStairs(int n) {
        vector<int>dp(n+1);
        //dp[0]=0;
         if (n <= 1) return n;
        dp[1]=1;
        dp[2]=2;
        for(int i=3;i<=n;i++){
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};

扩展:(ACM)

#include <iostream>
using namespace std;

// 爬楼梯问题的函数,输入 n 表示楼梯的阶数,返回方法数
int climbStairs(int n) {
    // 如果楼梯阶数小于等于2,直接返回 n,因为方法数就是 n
    if (n <= 2) {
        return n;
    }

    // 初始化第1阶和第2阶的爬楼梯方法数
    int dp1 = 1; // 表示到达第1阶的方法数
    int dp2 = 2; // 表示到达第2阶的方法数

    // 临时变量用于存储当前阶数的爬楼梯方法数
    int current = 0;

    // 动态规划,从第3阶开始计算到第n阶的爬楼梯方法数
    for (int i = 3; i <= n; i++) {
        // 当前阶数的方法数是前两阶方法数之和
        current = dp1 + dp2;

        // 更新 dp1 和 dp2,准备计算下一阶
        dp1 = dp2; // dp1 向前移动
        dp2 = current; // dp2 向前移动
    }

    // 最终返回 dp2,表示第n阶的方法数
    return dp2;
}

int main() {
    int n;
    // 输入楼梯的阶数
    cout << "请输入楼梯的阶数:";
    cin >> n;

    // 调用函数计算方法数并输出结果
    int result = climbStairs(n);
    cout << "爬到第 " << n << " 阶楼梯的不同方法有:" << result << " 种。" << endl;

    return 0;
}

1.C++的多态实现原理是什么?

多态是:允许同一接口通过不同类型的对象进行不同的行为。通过虚函数和继承体系来实现,就是动态多态。
核心是:虚函数表、虚指针

声明了虚函数时,编译器会创建一个独立的虚函数表
包含了虚函数指针,指向具体实现的函数。
如果子类重写了,那对应的条目将会指向子类的函数实现。

调用虚函数的时候:
通过虚指针找到对应的虚函数表
再根据虚函数表中记录的函数地址,调用具体的函数
这就是运行时多态,它运行的时候确定调用哪个函数。

静态多态:函数重载(函数名相同 参数不同)和模板

2、多态分几种类型?

1.静态:函数重载+模板(允许函数和类以通用方式实现。编译器根据传递的类型生成具体的函数版本。)(泛型编程 不用指定具体类型 可以自动生成具体类型)

2.动态:继承和虚函数

3.多态的特点有哪些?

1.接口的统一:从基类的接口可以调用派生类的行为
2.运行时多态:动态绑定 根据实际类型确定要调用的函数
3.可扩展性+可维护性(高内聚低耦合)
4.虚函数表的开销还是可以挺小的

4.智能指针本质是什么?

我认为智能指针的本质就是一个一个的模板类,然后引入了RAII的机制,资源获取时就初始化,来管理动态分配的资源,确保不使用的时候就可以自动释放。避免内存泄漏。
1.封装了原本的指针,析构函数是自动调用,并且可以自动delete。
2.引用计数:对于特定的那两个 还得维护引用计数,当引用计数为0的时候就释放资源。weak_ptr不影响引用计数的弱引用。防止循环应用。

5.malloc是如何工作的?底层调度原理,是系统调用吗?

首先malloc是在上分配内存,大小可以增长或者缩减。
只要调用malloc,就从堆里寻找大小合适的内存,返回其地址。
但是引入了内存池,就是预申请,然后使用。避免系统调用。
如果出现内存碎片问题,就会用空闲链表(free list) 或 伙伴系统(buddy system)管理。
first-fit:在空闲链表中第一个够大的用
best-fit:选择最小能满足要求的
worst-fit:选择最大的块

malloc用到的系统调用:
1.brk和sbrk:调用用于分配小块内存(通常小于128KB)
2.mmap:用于分配大块内存。

malloc工作过程:
1.初始化空闲链表 初始化呢哦寸尺
2.检查内存池,足够大的就可以分配了
3.内存池不够了,用brk/sbrk or mmap向os申请新的
4.更新空闲链表
5.free就可以释放

6.malloc有哪些缺点?

1.malloc维护了空闲链表 时间开销 性能不佳
2.产生内存碎片
3.仅仅分配了而已,还没有初始化。还得自己初始化。
4.malloc必须搭配free,不然就会内存泄漏
5.还不能动态扩展

7.mmap是什么?

就是内存映射文件,把文件或者其他内容被映射到虚拟地址空间。
避免使用系统调用read和write,提高性能。
程序可以像访问普通内存一样访问文件。

mmap 的使用场景:

文件内容的直接访问:通过映射文件,可以避免数据在用户空间和内核空间之间的拷贝,提高效率。
动态内存分配:在需要分配大块内存时,可以使用 mmap 来避免传统的堆分配方法可能导致的内存碎片问题。
进程间共享内存:通过映射相同的文件,或者使用匿名映射,可以实现进程间的内存共享。

8.多线程会有什么问题?

1.竞争:多个线程同时访问或者修改
2.死锁:等待彼此释放资源的无限期等待。
3.资源的竞争,i/o 内存 cpu
4.执行顺序
5.线程安全

9.Mysql的存储引擎你知道那些?区别是什么
在这里插入图片描述

9.索引分别有什么结构?

1.B树
2.B+树 变种 叶子节点存值 叶子节点还有链表
3.哈希表 键值对 不能范围
4.跳表 logn 随机化实现平衡 动态变化的高效查找

10.B+树和B树有什么区别?

1.B+树所有数据存储在叶子节点中 内部节点只有索引信息。
2.B+树叶子节点之间还有链表链接 可以范围查找
3.B+树的插入删除简单

11.索引使用的时候有什么需要注意的?

  1. 选择合适的索引类型

根据查询需求选择:

对于范围查询(如 BETWEEN、LIKE 'abc%')和排序操作,B-Tree 索引是合适的选择。
对于等值查询(如 =),哈希索引可能更高效。
对于复杂的文本搜索,全文索引(Full-Text Index)适合。
对于需要处理空间数据的应用,R-Tree 索引是合适的选择。
  1. 索引的覆盖范围

选择适当的列进行索引:

通常将经常用于查询条件(WHERE 子句)、排序(ORDER BY)和连接(JOIN)操作的列进行索引。
避免对经常变化的列(如经常更新的字段)进行索引,因为频繁的更新会影响索引的性能。
  1. 索引的数量

避免过多的索引:

虽然索引可以提高查询性能,但每个索引都需要额外的存储空间,并且会增加插入、删除和更新操作的开销。
过多的索引可能会导致性能下降,因此应根据实际需要合理设置索引数量。
  1. 索引的维护

定期重建和优化索引:

索引在数据库的使用过程中可能会变得碎片化。定期重建和优化索引可以提升性能。
在 MySQL 中,可以使用 OPTIMIZE TABLE 语句来优化表和索引。
  1. 索引的覆盖

利用覆盖索引:

覆盖索引(Covering Index)是指索引包含了查询所需的所有列,这样数据库可以通过索引来满足查询,无需访问表的实际数据。
使用覆盖索引可以显著提高查询性能。
  1. 监控和评估

监控索引的性能:

定期使用数据库的性能监控工具来评估索引的使用情况和效率。
使用 EXPLAIN 语句来分析查询执行计划,检查索引的使用情况。
  1. 索引的选择性

考虑索引的选择性:

索引的选择性是指索引列的唯一值的比例。选择性高的索引(唯一值多)通常比选择性低的索引(重复值多)更有效。
对选择性低的列建立索引可能不会带来显著的性能提升。
  1. 联合索引

合理使用联合索引:

对于多个列的查询条件,联合索引可以显著提高性能。需要注意联合索引的列顺序,通常将选择性高的列放在前面。
在查询中使用的列顺序应与联合索引的列顺序相匹配。
  1. 避免覆盖不必要的列

避免创建不必要的索引:

确保索引用于实际需要的列,避免在不经常用于查询的列上创建索引。
检查和移除冗余或无效的索引,以减少维护开销和存储需求。

12.索引的缺点是什么?

  1. 增加存储开销

额外的存储空间:

每个索引都需要额外的存储空间。尤其是在索引涉及多个列时,存储开销会显著增加。
对于大表或有多个索引的表,存储开销可能变得相当可观。
  1. 影响写操作性能

插入、更新和删除的开销:

索引需要在数据插入、更新和删除时进行维护。这会导致额外的开销,因为数据库必须同时更新索引。
在高并发的环境下,频繁的写操作可能导致性能下降。
  1. 可能的维护复杂性

索引的维护:

对索引进行定期维护(如重建、优化)是必要的,以避免碎片化和性能下降。维护索引可能增加管理复杂性和系统开销。
需要监控和分析索引的性能,确保它们在实际应用中仍然有效。
  1. 可能的选择性降低

选择性低的索引:

对选择性较低的列(如包含大量重复值的列)建立索引,可能不会显著提高查询性能,甚至可能导致性能下降。
对这些列的索引可能会增加额外的存储开销,但带来的性能提升有限。
  1. 影响查询优化

查询优化的挑战:

在某些情况下,数据库优化器可能无法选择最优的索引,导致查询性能下降。
需要定期检查和调整索引策略,以确保查询优化器能够利用正确的索引。
  1. 对多表连接的影响

连接性能的影响:

虽然索引可以提高单表查询的性能,但在复杂的多表连接查询中,索引的效果可能会受到限制。
不恰当的索引策略可能导致连接操作的性能问题。

13.使用索引查询一定会变快么?

使用索引通常可以提高查询性能,但并不总是保证查询一定会变快。索引的效果取决于多个因素,包括数据分布、查询类型、索引设计以及数据库的实际执行情况。

  1. 数据选择性

    选择性高的列:索引在选择性高的列上(即列中包含大量唯一值)通常能显著提高查询性能。例如,使用索引在员工表的员工ID列上进行查找。
    选择性低的列:如果索引的列选择性低(即列中包含大量重复值),索引的效果可能有限。例如,在性别列上建立索引,可能不会显著提高查询性能,因为性别列的值重复较多。

  2. 查询类型

    简单查询:对于简单的等值查询,索引通常能显著提高性能。例如,SELECT * FROM employees WHERE employee_id = 123。
    复杂查询:对于复杂的查询,如多表连接、大量数据聚合或子查询,索引的效果可能受到限制。索引不能总是优化所有复杂查询,特别是在涉及大量数据处理时。

  3. 索引设计

    索引选择:选择合适的索引类型(如 B-Tree、哈希索引、全文索引等)以及合理的索引组合对于提高查询性能至关重要。联合索引可能对多列查询更有效。
    索引维护:索引需要定期维护以防止碎片化。未优化的索引可能会影响查询性能。

  4. 查询计划

    数据库优化器会根据查询的执行计划选择是否使用索引。如果优化器判断使用索引不合适,可能会选择全表扫描。
    使用 EXPLAIN 语句可以帮助分析查询的执行计划,检查索引是否被有效使用。

  5. 数据更新频率

索引会增加数据插入、更新和删除操作的开销。如果表的写操作频繁,索引的维护成本可能会抵消其查询性能的提升。
6. 索引的选择性和覆盖性

覆盖索引:使用覆盖索引(即索引包含查询所需的所有列)可以显著提高性能,因为数据库可以只访问索引而不需要回表查询。
索引优化:确保索引列的顺序和组合适应查询条件,以最大化索引的效率。
  1. 表大小

在小表上,索引可能不会有明显的性能提升,因为全表扫描的成本可能与使用索引的成本相当。

14.redis有哪些持久化策略?二者在实际使用上有什么差异呢?

在这里插入图片描述

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

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

相关文章

线下线上陪玩系统要多少钱?该怎么搭建?

关于线下线上陪玩系统的价格&#xff0c;由于开发成本、功能复杂度、系统规模以及定制需求等因素的不同&#xff0c;价格差异较大&#xff0c;一般在几千元至几万元不等。具体价格需要根据实际需求和预算进行商议和定制。 搭建线下线上陪玩系统大致可以分为以下几个步骤&#…

推荐一款开源的链路监控系统

12.9k star&#xff0c;最强链路监控系统推荐&#xff0c;推荐 用过cat、pinpoint、skywalking等链路监控系统&#xff0c;各有优劣&#xff0c;但用的最多的还是pinpoint&#xff0c;工作6年&#xff0c;其中有4年都在用pinpoint&#xff0c;所以也比较熟悉&#xff0c;之前也…

戴尔笔记本电脑——重装系统

说明&#xff1a;我的电脑是戴尔G3笔记本电脑。 第一步&#xff1a;按照正常的装系统步骤&#xff0c;配置并进入U盘的PE系统 如果进入PE系统&#xff0c;一部分的硬盘找不到&#xff0c;解决办法&#xff1a;U盘PE系统——出现部分硬盘找不到的解决办法 第二步&#xff1a;磁…

年薪40W!转AI产品经理后,我明白了有人生的意义在哪了!

初识产品 目标有了&#xff0c;问题也有了 和很多人一样&#xff0c;毕业的时候比较迷茫&#xff0c;不知道自己喜欢什么行业、岗位… 就按照专业找了一个对口且擅长的算法工作&#xff0c;先着陆。 因为工作内容&#xff0c;我了解到了产品经理这个岗位&#xff0c;并对它…

掌握跟单与逼单技巧,大单成交不再是空谈!

1、精妙的迎宾艺术&#xff1a;解锁顾客心门的钥匙 在销售的殿堂里&#xff0c;每一位精明的导购都深知&#xff0c;与顾客的每一次接近&#xff0c;都是潜在成交乐章的序曲。掌握“五米关注、三米注视、一米搭话”的技巧&#xff0c;当顾客踏入店铺&#xff0c;目光流转于商品…

Syzkaller部署、使用与原理分析

文章目录 前言1、概述1.1、整体架构1.2、syz-manager进程1.3、syz-fuzzer进程1.4、syz-executor进程1.5、Generate进程1.6、Mutate进程 2、安装与使用2.1、源码安装2.1.1、部署系统依赖组件2.1.2、使用源码安装系统 2.2、使用方法2.2.1、下载编译测试内核2.2.2、配置测试虚拟机…

ElasticSearch分页查询性能及封装实现

Es的分页方式 fromsize 最基本的分页方式&#xff0c;类似于SQL中的Limit语法&#xff1a; //查询年龄在12到32之间的前15条数据 {"query":{"bool":{"must":{"range":{"user_age":{"gte":12,"lte":3…

【Java集合】Set 接口 —— HashSet 与 TreeSet 详解

Set接口和List接口一样&#xff0c;同样继承自Collection接口&#xff0c;它与Collection接口中的方法基本一致&#xff0c;并没有对Collection接口进行功能上的扩充&#xff0c;只是比Collection接口更加严格。与List接口不同的是&#xff0c;Set接口中的元素无序&#xff0c;…

Spring Boot使用配置方式整合MyBatis

文章目录 一、实战目标二、步骤概览1. 创建部门映射器接口2. 创建映射器配置文件3. 配置全局映射器4. 测试映射器接口 三、详细步骤1、创建部门映射器接口2、创建映射器配置文件3、配置全局映射器4、测试映射器接口 四、结语 一、实战目标 在本实战课程中&#xff0c;我们将学…

ChatGPT高级语音助手正式上线!OpenAI:50多种语言、9种声线可选

①OpenAI终于要面向其所有付费用户开放ChatGPT的类人高级人工智能&#xff08;AI&#xff09;语音助手功能——“高级语音模式”&#xff08;AVM&#xff09;&#xff1b; ②所有付费订阅ChatGPT Plus和Team计划的用户&#xff0c;都将可以使用新的AVM功能&#xff0c;不过该模…

qt P2P网络通信(tcp、udp)

一、TCP Qt中的TCP通信是基于Qt框架中的网络模块实现的&#xff0c;主要涉及到QTcpSocket和QTcpServer两个类。TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;适用于需要可靠传输的应用场景&#xff0c;如文件传输…

【实战篇】join语句怎么优化?

背景 在上一篇文章中&#xff0c;我们介绍了 join 语句的两种算法&#xff0c;分别是 Index Nested-Loop Join(NLJ) 和 Block Nested-Loop Join(BNL)。 我们发现在使用 NLJ 算法的时候&#xff0c;其实效果还是不错的&#xff0c;比通过应用层拆分成多个语句然后再拼接查询结…

数字化转型的理论指南:推动企业变革的全面路径

企业数字化转型的战略框架 在当今全球化的数字经济中&#xff0c;企业数字化转型已成为组织发展的核心战略。无论是初创公司还是跨国企业&#xff0c;成功的数字化转型不仅依赖于新技术的应用&#xff0c;还要求从战略到运营的全方位调整。这种转型不仅包括引入先进的技术&…

一键去水印小程序源码系统 下载无水印的高清图片 带完整的安装代码包以及搭建部署教程

系统概述 一键去水印小程序源码系统是一款专为图片去水印设计的软件开发包&#xff08;SDK&#xff09;&#xff0c;它集成了先进的图像处理技术和智能识别算法&#xff0c;能够自动识别并去除图片中的水印&#xff0c;同时保持图片的高清画质不受损。该系统支持多种图片格式&…

树莓派4B配置教程 1

目录 树莓派初次入门 树莓派系统烧录 开启树莓派 为树莓派配置SSH和VNC远程服务 树莓派初次入门 笔者最近入门了树莓派4b&#xff0c;打算后续使用树莓派做点小东西玩玩。 新到手的树莓派&#xff0c;默认是一块白板&#xff0c;我们是需要使用到的有如下这些东西&#xf…

基于AWR1642 讲解TI毫米波雷达开发环境搭建

文章内容同步发布在公众号&#xff08;雷达原理与系统&#xff09;,欢迎关注交流~ 这是第三篇文章&#xff0c;上一篇文章介绍了“TI官方资源介绍和使用”&#xff0c;感兴趣的可以去参考一下。本篇内容打算介绍基于AWR1642讲解TI毫米波雷达开发环境搭建&#xff0c;包括常用的…

24 基于51单片机的公交车报站仿真(LCD12864、DS1302、串口)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DS1302时钟模块读取时间&#xff0c;通过LCD12864显示实时时间&#xff0c;然后两个按键&#xff0c;一个按下表示到站&#xff0c;一个按下表示没到站。 到达站点&a…

亚信安全天穹5分钟勒索体检 免费试用今起上线

对于勒索攻击的认知 你是否还停留在“2.0时代”&#xff1f; 勒索攻击无疑是企业面临的最大威胁&#xff0c;2024年上半年&#xff0c;勒索组织数量同步增长超过50%&#xff0c;勒索攻击数量也持续攀升&#xff0c;平均勒索赎金突破520万美元。 当前&#xff0c;勒索攻击治理…

Spring Boot 进阶- 如何从配置文件中获取值?

&emps;在上一篇文章中,我们介绍了两种配置文件的方式,那么在添加完配置文件之后,我们如何从配置文件中获取到对应配置的值呢?这篇文章中我们就来看看这个问题。 一般的说SpringBoot中读取配置文件的方式有两种 @Value注解:基于@Value注解进行配置,一般适用于单个属性…

工业狗转行AI的心路历程,重新来过为时不晚!

言归正传&#xff0c;原本想写一篇人工智能大模型的科普文&#xff0c;为以后整理学习笔记开个头&#xff0c;但是细细琢磨了一下我这半吊子水平&#xff0c;怕是说不齐全。而且&#xff0c;我一直以来都很想跟把自己跨专业/行业转行AI的心路历程跟别人分享一下&#xff0c;希望…