- 博客(55)
- 收藏
- 关注
原创 算法专题--位图
本文主要讲解关于位图的相关算法题。一、判断字符是否唯一面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)本题最容易想到的思路就是使用哈希表或者是数组模拟哈希表,但是使用位图的话可以更加节省空间。//鸽巢原理i++){}else{
2025-01-25 00:29:03
878
2
原创 算法专题--前缀和
目录前言一、一维前缀和二、 寻找数组的中心下标三、除自身以外数组的乘积四、连续数组总结前言前缀和和动态规划类似,在解决问题之前先生成一张前缀和表,然后根据前缀和表可以更简单的解决问题。链接:【模板】前缀和_牛客题霸_牛客网本题是最简单的前缀和问题,可以看作是前缀和问题的模板,主要分为三步,处理输入,根据合适的递推公式构造前缀和表,使用前缀和表。二、 寻找数组的中心下标链接:724. 寻找数组的中心下标 - 力扣(LeetCode) 从中心下标的定义可知,除中心下标的元素外,该元素左边的「前缀和」等
2025-01-24 21:55:20
462
原创 算法专题——二分查找
本文主要介绍二分算法的思想和相关题目。很多介绍都说二分算法往往需要有序,但实际有序并不是使用二分算法的核心,使用二分算法的核心应该是两段性,也就是能根据题目条件把整个区间分为两段。1、二分查找本题是最基础的二分查找算法,之后的题目都是建立在本题的基础上:a. 定义 left , right 指针,分别指向数组的左右区间。i. arr[mid] == target 说明正好找到,返回 mid 的值;
2025-01-16 18:30:06
927
原创 算法专题 —— 滑动窗口
本文主要总结一些和滑动窗口有关的算法题。当我们需要处理一段连续数据时往往可以考虑用滑动窗口。滑动窗口也可以称作同向双指针,主要分为四步。1、定义left=0,right=0,初始化指针 2、入窗口(移动右指针)3、判断条件出窗口(这个步骤往往要循环执行,出窗口指的是移动左指针,在判断条件的while循环里往往要有更改条件值的语句)4、更新值(这一步不一定是最后一步,也可能在中间完成,要根据具体情况分析)。1、长。
2025-01-08 16:12:59
940
原创 算法专题——双指针
本文主要介绍一些用到双指针的常见算法题。1、移动0本题为数组分隔、数组分块问题,常见解法是使用双指针。定义两个指针分别为cur和dest,将该数组划分为三个部分。使用cur遍历数组,cur前代表处理完的数据,cur后代表待处理的数据。dest前代表非0数字,dest后为0数字。n为数组长度,数据会被划分为三个区间,[0,dest]为处理后非零,[dest+1,cur-1]为处理后0,[cur,n-1]为待处理。
2024-12-23 11:32:59
715
原创 HTTPS协议
HTTPS协议是在HTTP协议的基础上加了一个加密层。因为HTTP协议是明文传输的,这样很容易被别人获取到信息。有意思的是HTTPS的使用最开始不是用来防止黑客入侵,而是为了防止运营商劫持。因为我们的信息都是在运营上的设备之上进行传输的,所以运营商有能力获取到我们的数据并加以篡改从而获取到一些不正当的收益。
2024-12-20 19:01:08
620
原创 MySQL表的约束
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。
2023-01-03 23:27:26
547
原创 MySQL数据类型
varchar是变长字符串,L表示最大容量,在实际存储中是用多少空间开辟多少空间,类似C++ STL中的vector。timestamp类型数据是不需要我们自己插入的,mysql会根据时间戳自动填充当前时间,当我们改动某个数据时,他所对应的timestamp也会随之刷新,变成当前时间。如果定义的是float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99。语法:char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255。
2023-01-03 14:20:36
974
原创 TCP/IP协议数据链路层
MTU相当于发快递时对包裹尺寸的限制,这个限制是不同的数据链路对应的物理层, 产生的限制。以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位。在网络通信时,源主机的应用程序如果只知道目的主机的IP地址,却不知道目的主机的硬件地址(MAC),那么就无法在数据链路层传输。IP协议最大的意义是路径选择,要把数据送到哪是IP决定的,如何把目标送到指定地点是数据链路层决定的。ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。
2022-11-05 19:42:25
1132
3
原创 TCP/IP协议网络层
NAPT与NAT的区别在于,NAPT不仅转换IP包中的IP地址,还对IP包中TCP和UDP的Port进行转换。由于每个私有IP和端口号在子网中都具有唯一性,所以每次通过路由器转接时,都会将子网中主机的IP地址和端口号与WAN口IP和端口进行转换并形成映射表,在服务器想要应答的时候就可以通过每个节点的映射关系锁定目标主机。如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址。
2022-11-05 19:41:17
1932
原创 TCP/IP协议传输层详解
传输层协议主要有两个,分别是UDP协议和TCP协议。我们说了TCP是可靠连接, 那么是不是TCP一定就优于UDP呢?TCP和UDP之间的优点和缺点, 不能简单, 绝对的进行比较。归根结底, TCP和UDP都是程序员的工具, 什么时机用, 具体怎么用, 还是要根据具体的需求场景去判定。
2022-10-26 20:41:15
4939
原创 TCP/IP协议用户层详解
Content-Type: 数据类型(text/html等)Content-Length: Body的长度Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;User-Agent: 声明用户的操作系统和浏览器版本信息;referer: 当前页面是从哪个页面跳转过来的;Connection:表示支不支持长链接location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;Cookie: 用于在客户端存储少量信息。通常用于实现会话(session)的功能。
2022-10-21 20:48:17
1509
原创 C++的类型转换
C语言中原有的类型转换存在缺陷,且可读性较差,所以C++增加了新的类型转换规范,我们一起来学习一下吧。1. C语言中的类型转换在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败。显式类型转化:需要用户自己处理。
2022-10-04 18:13:09
573
原创 智能指针详解
C++11中引入了智能指针的特性,本文将详细介绍智能指针的使用。1、为什么需要智能指针?{delete p1;delete p2;}在这段代码中,如果在div中抛异常,很显然会造成内存泄漏。为了避免内存泄漏,我们希望有一种指针可以做到自动管理内存释放。
2022-10-01 21:42:49
5102
1
原创 C++ 异常详解
在c语言中我们只能使用传统的返回错误码方式来处理错误,有时候会很不方便。所以在c++中增加了异常这一特性。1、C语言传统的处理错误的方式终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。本文主要简单介绍了异常的使用,希望能给大家带来帮助。
2022-09-30 20:26:20
1947
原创 C++11详解
C++11对比C++98带来了数量可观的变化,增加了很多新特性。相比较而言C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多。所以对C++11的学习是很重要的。一、统一的列表初始化在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在。
2022-09-30 19:03:48
9668
2
原创 特殊类设计
小伙伴们大家好,本文主要介绍一些常见特殊类的设计方式,希望能给大家带来帮助。设计一个类,不能被拷贝拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。实现方法:将拷贝构造函数和赋值运算符都设为私有即可满足要求。这里只需声明无需定义,因为该函数根本不会调用,定义了也没有意义。
2022-09-24 19:57:49
569
原创 <stl系列>哈希表详解,掌握stl容器从现在开始
哈喽,小伙伴们大家好,今天我们来学习几个新的容器。这几个容器存储和查找数据效率是非常高的,能达到非常理想的O(1),这主要因为它们采用了哈希的思想。那么事不宜迟,我们一起来看看吧。一、unordered系列关联式容器c++中容器分为序列式容器和关联式容器。所谓序列容器,就是以线性排列来排列某种类型的数据,比如vect,list,dequene。序列式容器通常只是单纯的用来存储数据。
2022-09-22 20:33:02
2085
1
原创 AVL树和红黑树
哈喽,小伙伴们大家好。之前我们介绍了二叉搜索树用于搜索数据,但是二叉搜索树具有一些缺陷,比如在大多数节点的子节点都只有一个时,那搜索二叉树就会近似成一条线,搜索的时间复杂度就会从O(logN)退化成O(N)。针对这个问题,一些人对二叉搜索树进行了升级改造,也就是我们今天要学习的AVL树与红黑树。一、AVL树我们定义AVL树的节点时,不但有左右指针,为了方便还增加了父节点的指针。其中bf代表平衡因子。//banlance factor 平衡因子。
2022-09-18 13:45:07
1365
原创 Linux多线程
哈喽,小伙伴们大家好。在之前的文章中我介绍过进程,想必小伙伴们对进程也都有一定的了解。今天我将介绍一个新概念——线程,线程的本质是什么呢?线程和进程的联系是什么呢?线程本身又有哪些特性呢?这些问题都将在下面的文章中得到答案,话不多说,我们赶紧开始吧。一、Linux线程概念在一个进程里的执行路线就叫做线程。我在之前的文章中提到过,每个进程都对应一个task_struct,而每个task_struct都指向不同的地址空间,在不同的地址空间中根据页表映射到物理内存中。
2022-09-11 17:59:41
1535
原创 Linux信号详解
目录前言一、信号概念1、生活中的信号2、计算机中的信号 3、实现信号捕捉二、产生信号的方式1. 通过终端按键产生信号格外拓展:核心转储(core dump)status 2、调用系统函数向进程发信号3. 由软件条件产生信号 4、硬件异常产生信号三、阻塞信号1、概念 2、内核中的表示3、信号集操作函数3.1用户层函数3.2 系统接口四、信号捕获1、用户态和内核态 2、内核如何捕获进程信号2.1捕获信号过程2.2 sigaction五、函数的重入六、c语言关键字volatile总结哈喽,小伙伴们大家好,本篇文章
2022-08-31 18:57:38
4734
5
原创 Linux进程间通信
哈喽,小伙伴们大家好。我们都知道在完成一个任务时,往往是多个进程一起协调工作的,那么在工作的过程中,进程间必然需要产生交流,那么它们之间是如何交流的呢?本篇文章将给大家答疑解惑,详细讲解进程间通信。事不宜迟,快拿起小本本,和我一起开始吧。一、进程通信介绍共享内存是进程通信的最快方式,因为在读写共享内存的时候,并没有使用系统接口,直接就可以访问。共享内存通信优点:速度块,拷贝次数少。共享内存通信缺点:没有提供保护机制(互斥和同步)。...
2022-08-26 20:53:43
1356
3
原创 <stl系类> map和set详解,掌握stl容器从现在开始
哈喽,小伙伴们大家好。今天我们继续来学习STL容器,今天我将主要介绍map和set的使用。话不多说,拿好小本本,我们赶快开始吧。一、关联式容器1、关联式容器概念在之前我们接触过STL的部分容器,比如vector,deque,list。这些容器统称为序列式容器,底层为线性结构,存储的是元素本身。那什么是关联式容器呢?关联式容器也是用来存储数据的,与序列式容器不同的是,关联式容器中存储的结构的键值对,有助于数据检索。...
2022-08-25 13:16:08
758
2
原创 搜索二叉树详解
哈喽,小伙伴们大家好。今天我来给大家介绍一种新的二叉树结构——搜索二叉树。搜索二叉树是后面学习AVL树和红黑树的基础,学好它对于后面学习一些复杂的数据结构很有帮助。那么事不宜迟,我们赶快开始吧。
2022-08-21 19:44:30
1038
原创 动静态库详解
哈喽,小伙伴们大家好。大家有没有好奇一个问题,我们写代码时,都是包含头文件后直接调用printf,scanf等函数,那么代码的实现是在哪里呢?这就要设计的库的知识。一、动静态库的基本原理库包括动态库和静态库,统称为动静态库。动静态库的本质是可执行程序的半成品。程序在进行完汇编阶段后生成.o二进制文件,然后这些二进制文件打包形成库。库的本质:一堆.o文件的集合,不包含main,但是包含了大量的实现方法。...
2022-08-11 16:25:59
1430
7
原创 Linux文件操作及原理详解
哈喽,小伙伴们大家好。相信大家在学习语言时都接触过文件操作,但仅仅站在语言层面上是无法真正理解文件的,那么今天我就带大家从系统角度重新学习文件。一、引入1、几个基本概念如果小伙伴们学习过c语言文件的I/O操作, 应该对fopen, fclose, fread, fwrite等函数有一定了解,它们都是C标准库当中的函数。但单单从语言的角度很难真正理解这些操作,今天我想从系统的角度带大家重新认识一下I/O。文件的操作如果没有指名路径,默认都是在当前路径。...
2022-08-10 18:20:31
1381
1
原创 linux操作系统进程控制详解
哈喽,小伙伴们大家好,今天我来带大家了解一下进程控制的相关知识。我将主要从四个方面进行讲解,分别是进程创建、进程终止、进程等待和进程替换。希望小伙伴们看完本文后能对进程有更加深刻的认识。一、进程创建。......
2022-08-05 10:44:08
618
1
原创 二维数组零碎知识梳理
哈喽,小伙伴们大家好。在c语言中二维数组的结构比较复杂,尤其是和指针结合到一起后。由于最近一直在学c++,对二维数组的部分知识感觉生疏了,所以写一篇博客对这些知识进行总结。一、二维数组的结构我们可以把二维数组理解成是先有一个一维数组,然后一维数组的元素类型同样是一维数组,也就是数组里嵌套数组。把每一行理解成一个独立的数组,arr[i]选择第i行的数组,arr[i][j]选择第i行第j个元素。那么二维数组在内存中是怎样分布的呢?intmain(){i...
2022-08-01 16:14:04
491
2
原创 Linux进程基本知识详解
哈喽,小伙伴们大家好,进程是操作系统中非常重要的一个概念,今天我将在linux系统下带大家了解进程的一些基本知识。事不宜迟,拿好小本本,我们赶紧开始吧~
2022-08-01 14:54:08
5815
10
原创 操作系统概念介绍
目录前言一、冯诺依曼体系结构1、冯诺依曼体系组成2、信号传递过程二、操作系统1、操作系统简介2、管理的理解3、系统调用和库函数概念总结哈喽,小伙伴们大家好。从今天起,我将和大家一起学习操作系统。操作系统是计算机知识体系中非常重要的一门课。在学习操作系统之前,我们对一个程序的理解仅仅停留在代码阶段,而学习操作系统后,我们可以从系统层面有更加深刻的认识。今天我就先来简单介绍以下操作系统的相关概念。冯诺依曼体系结构是从硬件层面产生的结构,我们常见的计算机或者服务器都遵守冯诺依曼体系结构。冯诺依曼体系由输入设备,输
2022-07-30 21:28:38
1228
7
原创 面向对象三大特性之一——多态详解
哈喽,小伙伴们大家好。上一章我们一起学习了继承,今天我们继续来学习面向对象三大特性中的最后一个特性——多态。事不宜迟,快拿起小本本,跟我一起开始吧。一、多态的概念多态,顾名思义,也就是多种状态。通俗点说就是不同的对象去干同一件事情时会产生不同的状态。以买火车票为例,普通人买票就要付全款,学生买票就可以出半价,军人虽然不能优惠但是可以优先买票。放到我们程序中就是不同继承关系的类对象去调用同一个函数,会产生不同的状态。在了解多态的构成条件前,我们先来了解一个概念,虚函数。在同一个作用域。......
2022-07-23 09:43:37
2260
5
原创 面向对象三大特性之一——继承详解
hello,小伙伴们大家好。相信对面向对象有一定了解的小伙伴都知道面向对象的三大特性为封装、继承、多态。封装特性我们已经在类和对象中体验到了,那么今天我们就来接着学习面向对象的继承特性。一、继承的概念与定义下面我们看到的Person是父类,也称为基类。Student是子类,也成为派生类。继承后父类的Person成员(成员变量和成员函数)都会成为Student的一部分。{public{}protected//姓名//年龄};{protectedint_stuid;......
2022-07-22 20:21:41
1676
3
原创 <STL系列>,stack和queue详解,掌握STL容器从现在开始
哈喽大家好,今天我们继续来学习STL的容器。本章主要讲解STL中栈和队列的相关知识,小伙伴们快拿好笔记本,让我们一起开始吧。一、stack的介绍和实现(1)stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。(2)stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素。empty判空操作back获取尾部元素操作push_back尾部插入元素操作empty{...
2022-07-17 20:46:14
919
5
原创 最常用的几大排序汇总
目录前言一、常见的排序方法二、插入排序1.插入排序的思想2、直接插入排序2.1直接插入排序的实现2.2插入排序特点 3、希尔排序3.1希尔排序介绍 3.2希尔排序实现三、选择排序 1、基本思想2、直接选择排序 3、堆排序四、交换排序1、冒泡排序2、快速排序2.1快速排序单趟排序的实现方法2.2快速排序优化2.3快递排序的非递归写法五、归并排序1、归并排序概念2、归并排序的递归实现 3、归并排序的非递归实现 六、非比较排序七、排序算法复杂度和稳定性分析 总结哈喽,小伙伴们大家好。排序一直是算法中的一个重要内容
2022-07-12 14:05:54
2456
2
原创 <stl系列>,vector深度剖析,掌握stl容器从这篇文章开始
目录前言一、vector的介绍二、vector的使用1.基本函数接口2、迭代器失效2.1案例一2.2案例二三、vector的模拟实现1、核心框架图例2、核心框架接口模拟实现 3、使用memcpy拷贝问题总结哈喽,小伙伴们大家好。上一篇文章我们介绍了string类,和string一样,vector同样是stl容器的重要组成部分,那么今天就让我们一起来学习一下吧。vector学习时一定要学会查看文档:vector的文档介绍,vector在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了哪些接口是要
2022-07-09 13:58:19
378
8
原创 二叉树详解
目录前言一、树的概念和结构1、树的概念2、树的表示 3、树在实际中的应用(表示文件系统的目录树结构)二、二叉树概念及结构1.概念 2、特殊的二叉树3、二叉树的性质4、二叉树的存储4.1顺序存储4.2链状存储 三、二叉树的顺序结构和实现1、二叉树的顺序结构2、堆的概念及结构3、堆的实现3.1堆的代码框架3.2堆的插入3.3堆的删除3.4堆的建立 3.5建堆的时间复杂度 4、堆的应用4.1堆排序 4.2TOP-K问题四、二叉树链式结构的实现 1、建二叉树2、二叉树的遍历2.1前序、中序以及后序遍历2.2层序遍历
2022-07-09 13:48:50
55380
8
原创 c语言字符函数和字符串函数介绍
目录前言一、strlen函数1.简介2、模拟实现2.1计数器方式2.2递归方式2.3指针的方式二、strcpy函数1.简介2.模拟实现三、strcat函数1.简介2、模拟实现四、strcamp函数1、简介2、模拟实现五、strncpy函数六、strncat函数七、strncmp函数八、strstr函数1、简介2.模拟实现9、strtok函数 1、简介2、举例10、strerror函数11、memcpy函数1、简介2、模拟实现12、memmove函数1、简介2、模拟实现 13、memcmp函数c语言中对字符和
2022-06-13 21:05:35
1413
原创 Linux环境基础开发工具使用
目录前言一、Linux软件包管理器yum1.什么是软件包?2.查看软件包2.1 关于lrzsz2.2 搜索软件包3.安装与卸载软件3.1安装软件3.2 卸载软甲二、Linux编辑器-vim使用1.vim的基本概念2.vim的基本操作 2.1命令模式基本操作2.2 底层模式基本操作三、Linux编译器,gcc/g++的使用1.如何进行编译编辑 2.编译的四个过程2.1预处理(-E)2.2编译(-S)编辑 2.3汇编(-c)编辑 2.4链接3.函数库3.1函数库的概念3.2 动态库与静态库3.3动态库和静
2022-06-10 18:03:52
2839
6
原创 Linux权限详解
目录前言一、shell命令以及运行原理三、Linux权限管理1.文件访问者的分类2.文件类型和访问权限2.1文件类型2.2权限访问属性3.文件访问权限的修改3.1权限的增加与减少3.2 八进制数设置权限3.3 目录权限含义4.用户身份的修改 4.1修改文件拥有者:4.2 修改文件所属组: 5.默认权限解析 四、粘滞位总结在社会中我们每个人都有各自的身份,而相应的身份又决定着是否具有对应的权限。比如我们想要管理一个仓库,那必须要具有仓库管理员的身份。Linux系统中同样具有权限的概念,那接下来我们就来一起看
2022-06-06 13:58:14
7447
22
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人