自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 Thread Local存储

c++11 关键字 Thread Local 简要总结

2023-02-28 20:53:58 143

原创 LeetCode416.分割相同子集

LeetCode416.分割等和子集相似题目难易程度middle题目考察回溯动态规划暴力解法思路及算法:最容易想到的方法是用回溯法暴力搜索所有答案,使用二维数组res保存结果,path保存找到的一个数组。//时间复杂度:O(N * 2^ N) 空间复杂度:O(N * M)#include<iostream>#include<vector>#include<algorithm>using namespace std;class So

2021-09-04 17:10:59 217

原创 虚拟内存简单总结

虚拟内存为什么要建立虚拟内存为了防止不同进程同一时刻在物理内存中运行而对物理内存抢夺,采用了虚拟内存。虚拟内存技术使得不同进程在运行过程中,所看到得是自己占有了当前系统得4G内存。所有进程共享同一物理内存,每个进程只把自己目前所需要得虚拟内存通过文件管理单元映射到物理内存上。事实上,虚拟内存对应位置的程序没有立即映射到物理内存上,只是建立好虚拟内存和磁盘文件之间的映射(存储器映射),等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配

2021-08-27 17:48:41 1439

原创 在编译环境下的数组定义总结

编译vector可以在编译环境下怎么定义,怎么定义一维数组,定义二维数组,这些问题可以总结一下vector定义一维数组int main() { int a[] = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1}; vector<int> cost(a, a + sizeof(a) / sizeof(int)); Solution solution; cout << solution.minCostClimbingStai

2021-08-22 20:06:57 164

原创 leetcode 222.完全二叉树的节点个数

文章初心笔者是应届生,二叉树的遍历以及二叉树的属性等对于面试来说,显得尤为重要,今天用一道题来巩固二叉树的遍历和二叉树的属性的知识。难易程度middle题目考察二叉树的遍历递归调用栈的使用满二叉树的性质深度优先遍历(后序遍历)思路:先递归左子树的节点个数,再递归右子树的节点个数,最后返回左右子树节点个数 + 1(根节点自身)//时间复杂度O(nlogn) 空间复杂度O(n)class Solution {public: int getNum(TreeNode*

2021-08-22 10:54:34 49

原创 leetcode102.二叉树的层序遍历

leetcode102.二叉树的层序遍历文章初心笔者是应届生,二叉树的遍历对于面试来说,显得尤为重要,故今天总结一个层序遍历版本,希望能举一反三。相关题型:leetcode 107.二叉树的层序遍历||leetcode 109.二叉树的右视图leetcode 637. 二叉树的层平均值leetcode 429.N叉树的层序遍历leetcode 515.在每个树行中找最大值leetcode 116.填充每个节点的下一个右侧节点指针leetcode 117.填充每个节点的下一个右侧节点指针

2021-08-20 09:11:40 80

原创 leetcode 94.二叉树的中序遍历

文章初心笔者是应届生,二叉树的遍历对于面试来说,显得尤为重要,故今天总结一个递归版本。相关题型:leetcode 144.二叉树的前序遍历leetcode 145. 二叉树的后序遍历难易程度easy题目考察二叉树的遍历递归调用递归解法思路:定义返回值参数类型,确定终止条件,递归左子树,再插入根节点值,递归右子树,最终返回结果数组class Solution {public: vector<int> inorderTraversal(TreeNode

2021-08-19 10:10:11 976

原创 leetcode 145. 二叉树的后序遍历

文章初心笔者是应届生,二叉树的遍历对于面试来说,显得尤为重要,故今天总结一个递归版本。相关题型:leetcode 144. 二叉树的前序遍历leetcode 94. 二叉树的中序遍历难易程度easy题目考察二叉树的遍历递归调用递归解法思路:定义返回值参数类型,确定终止条件,递归左子树,递归右子树,再插入根节点值,最终返回结果数组class Solution {public: void traversal(TreeNode* cur, vector<in

2021-08-19 10:09:10 99

原创 leetcode 144. 二叉树的前序遍历

文章初心笔者是应届生,二叉树的遍历对于面试来说,显得尤为重要,故今天总结一个递归版本。相关题型:145. 二叉树的后序遍历94. 二叉树的中序遍历144.二叉树的前序遍历难易程度easy题目考察二叉树的遍历递归调用递归解法思路:定义返回值参数类型,确定终止条件,先根节点,再递归左子树,递归右子树,最终返回结果数组class Solution {public: vector<int> preorderTraversal(TreeNode* root)

2021-08-19 09:50:41 111

原创 LeetCode844.比较含退格的字符串

LeetCode844.比较含退格的字符串相似题目leetcode283.移动零难易程度easy题目考察栈的使用双指针数组元素的移动暴力解法思路及算法:最容易想到的方法是将给定的字符串中的退格符和应当被删除的字符都去除,还原给定字符串的一般形式。然后直接比较两字符串是否相等即可。用栈处理遍历过程,每次我们遍历到一个字符:如果它是退格符,那么我们将栈顶弹出;如果它是普通字符,那么我们将其压入栈中//时间复杂度:O(N+M) 空间复杂度:O(N+M)O(N+M)class

2021-08-18 11:03:58 111

原创 LeetCode 283.移动零

难易程度考察点暴力解法优化解法

2021-08-18 10:01:15 61

原创 LeetCode中的代码如何在本地编译器编译成功

文章初心笔者是应届生,现在的面试都不仅是核心代码模式,很多公司开始考察ACM模式,而在leetcode刷题时,都是核心代码模式,我相信很多同学像我一样,就没怎么接触过ACM模式,假如没接触ACM模式,面试中,很可能惊慌失措,接下来我将简单的介绍一下在编译器编译代码。头文件ACM模式首先就是自己写头文件,以下是经常要用到的头文件。#include< cstdio >在C++中拥有在C语言里一样的语法,像输入输出。#include< cstring >包含很多

2021-08-17 11:37:11 3341

原创 内核态与用户态的理解

内核态和用户态之间的区别 用户态和内核态是操作系统的两种运行级别,两者最大的区别就是特权级别不同。用户态拥有最低的特权级,内核态拥有较高的特权级。运行再拥护态的程序不能直接访问操作系统内核数据结构和程序。用户态到内核态的转化原理用户态切换到内核态的3种方式1.系统调用这是用户态主动要求切换到内核态的一种方式,用户进程通过系统调用申请操作系统提供的服务程序完成工作。而系统调用的机制核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的ine 80h中断。 2. 异常

2021-07-26 17:14:08 429

转载 netstat命令详解

netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。语法:netstat [选项]参数:-a或–all:显示所有连线中的Socket;-A<网络类型>或–<网络类型>:列出该网络类型连线中的相关地址;-c或–continuous:持续列出网络状态;-C或–cache:显示路由器配置的快取信息;-e或–extend:显示网络其他相关信息;-F或–fib:显示FIB;-g或–groups:显示

2021-07-26 15:47:59 5786

原创 索引本质总结

索引的本质索引是帮助MySQL高效获取数据的排好序的数据结构既然索引是种数据结构,那么其底层是什么数据结构呢?其实可以归纳为四种数据结构。二叉树红黑树Hash表B-TreeB+Tree二叉树容易造成链表,查询效率特别低红黑树大数据量时,树的深度太深,导致查询效率很慢Hash对索引的key进行一次hash计算就可以定位出数据存储的位置很多时候Hash索引要比B+树索引更高效仅能满足 “=” , “IN” , 不支持范围查询hash冲突问题B-Tree

2021-07-12 18:19:51 99

原创 数据库索引总结

什么是索引?索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓名来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。讲了这么多,其实索引就是一种排好序的数据结构。索引有什么作用?索引的主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。索引有什么优点?通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。可以大大加快数据的检索速度,这也是创建索引的主要原

2021-07-12 17:44:39 431

原创 归并排序总结

归并排序原理将一个大的无序数组有序,我们可以把大的数组分成两个,然后对这两个数组分别进行排序,之后在把这两个数组合并成一个有序的数组。由于两个小的数组都是有序的,所以在合并的时候是很快的。通过递归的方式将大的数组一直分割,直到数组的大小为 1,此时只有一个元素,那么该数组就是有序的了,之后再把两个数组大小为1的合并成一个大小为2的,再把两个大小为2的合并成4的 … 直到全部小的数组合并起来。可以用动图描述为:思想总结为:把长度为n的输入序列分成两个长度为n/2的子序列;对这两个子序列分

2021-07-04 19:23:31 77

原创 剑指offer 29.顺时针打印矩阵总结

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。解题思路:根据题目示例 matrix = [[1,2,3],[4,5,6],[7,8,9]] 的对应输出[1,2,3,6,9,8,7,4,5] 可以发现,顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环。算法流程:空值处理: 当 matrix 为空时,直接返回空列表 [] 即可。初始化: 定义向右,向下,向左, 向右四个方向坐标变换值, 用于打印的结果列表 res 。循环打印: “从左向右、

2021-06-26 11:34:31 68

原创 冒泡排序总结

原理冒泡排序就是把小的元素往前调或者把大的元素往后调,比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。可用动图描述为:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对

2021-06-16 15:10:13 269

原创 STL中list与queue之间的区别

STL中list与queue之间的区别list不再能够像vector一样以普通指针作为迭代器,因为其节点不保证在存储空间中连续存在;list插入操作和结合才做都不会造成原有的list迭代器失效;list不仅是一个双向链表,而且还是一个环状双向链表,所以它只需要一个指针;list不像vector那样有可能在空间不足时做重新配置、数据移动的操作,所以插入前的所有迭代器在插入操作之后都仍然有效;deque是一种双向开口的连续线性空间,所谓双向开口,意思是可以在头尾两端分别做元素的插入

2021-06-15 22:07:47 2039

原创 Select,Poll和Epoll三种IO多路复用总结

Select多路IO转接原理:借助内核, select来监听,客户端连接,数据通信事件。Select函数原型分析void FD_ZERO(fd_set *set); --- 清空一个文件描述符集合。fd_set rset;FD_ZERO(&rset);void FD_SET(int fd, fd_set * set); ----将带监听的文件描述符,添加到监听集合中FD_SET(3, &rset); FD_SET(5,&rset); FD_SET(6, &a

2021-06-01 20:12:33 91

原创 vector 和 list 的区别 总结

vector 和 list 的区别概念Vector:连续存储的容器,动态数组,在堆上分配空间,一次性分配内存,不够时才进行两倍扩容底层实现: 数组性能访问: O(1)增添,删除 :O(n)List动态链表, 在堆上分配空间,每插入一个元素都会分配空间,每删除一个元素都会释放空间。底层实现:双向链表性能访问:O(n)增添, 删除 :O(1)区别VectorList底层实现数组双向链表是否支持随机访问支持不支持是否顺序内存是不是访问

2021-05-23 20:37:32 119

原创 五种IO模型总结

五种模型分别为:阻塞IO, 非阻塞IO,多路复用IO, 信号驱动IO, 异步IO阻塞IO :调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的去检查这个函数有没有返回,必须等待这个函数返回才能进行下一步动作。流程图为:作为最传统的一种IO模型,即在读写数据过程中会发生阻塞现象,典型的阻塞IO模型例子为:data = socket.read();如果数据没有就绪,就会一直阻塞在read方法。非阻塞IO:非阻塞等待, 每隔一段时间就去检测IO事件是否就绪。没有就绪就可以做其他事。流

2021-05-22 15:24:43 105

原创 五种IO模型详解

五种IO模型(学习笔记)阻塞IO ,非阻塞IO,信号驱动IO, IO复用/多路转接IO, 异步IO 五种模型阻塞IO最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。典型的阻塞IO模型的例子为:data = socket.read();如果数据没有就绪,就会一直

2021-05-22 14:55:07 239

原创 堆排序总结

堆排序原理基本思想:将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的 n-1 个子序列重新构造成一个堆,这样就会得到 n 个元素中的次大值。如此反复执行,就能得到一个有序序列。可用动图描述为:**性能**时间复杂度空间复杂度稳定性O(nlogn)O(1)非稳定性排序C++代码如下:#include<iostream>using names

2021-05-17 20:51:57 254 6

原创 C++快排算法总结

快排算法原理通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可对这两部分记录继续进行排序。简单点理解为,首先随便找到一个基准值(通常都选为第一个值),然后经过一轮排序后,小于基准值的放基准值前面,大于基准值的放基准值后面。接着我们通过递归的方式,让基准左右两边的数也重复同样的操作,直到不可分割为止,此时每个数都是有序的位置。可用动图描述为性能时间复杂度空间复杂度稳定性O(nlogn)O(logn)非稳定排序空间复杂

2021-05-17 11:50:12 634 6

原创 GET 和 POST 的区别

**GET 和 POST 的区别**概括*对于GET方式的请求, 浏览器会把http header 和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器会先发送header, 服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)具体请求过程post请求的过程:(1)浏览器请求tcp连接(第一次握手)(2)服务器答应进行tcp连接(第二次握手)(3)浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在

2021-05-07 08:47:17 91 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除