自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 第一个只出现一次的字符

题目描述:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)。这道题在面试的时候被问到,当时只写出来时间复杂度为O(N^2)的代码,面试官说时间复杂度太大,让我优化一下,结果没有写出来最优代码。回来一翻剑指offer才发现是原题(面试题50),太后悔了,都怪自己没有好好看书!!...

2019-09-22 20:41:01 209

原创 数组中只出现一次的两个数字

题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路:(1)将整个数组的数字从头到尾异或,得到一个结果数字(2)找到结果数字二进制表示中最右边为1的位(3)根据(2)中找到的位置,判断数组中每个数字该位置是否为1,将数组分为两组,这样每组数字中都有一个只出现一次的数字(4)将分好的两组数字分别异或,最终各得到一个数字...

2019-09-22 20:17:49 297

原创 合并两个排序的链表

问题描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。对于这个问题,可以有两种解法:一是递归实现,而是非递归实现。代码如下: //递归实现 ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(pHead1 == NULL) ...

2019-08-28 23:28:47 223

原创 IP地址及划分子网

目录IP地址IP地址的分类IP地址的分类点分十进制记法常用的三种类别的IP地址IP地址和硬件地址划分子网从两级IP地址到三级IP地址子网掩码子网掩码的应用默认子网掩码子网划分的方法IP地址是在互联网上给主机编址的方式,为每个计算机分配一个在全世界范围是唯一的32位的标识符,这样不但能够对计算机进行识别,还能进行信息共享。IP地址的分类...

2019-08-23 23:52:41 1836

原创 HTTP协议为什么是无状态的?如何让HTTP“有状态”?

在面试中被问到HTTP协议是有状态还是无状态的,当场就有点懵,因为不会就没答出来。还是得总结一下啵!一、HTTP协议的状态HTTP是一种无状态协议,即服务器不保留与客户交易时的任何状态。也就是说,上一次的请求对这次的请求没有任何影响,服务端也不会对客户端上一次的请求进行任何记录处理。二、HTTP协议的无状态性带来的问题:用户登录后,切换到其他界面,进行操作,服务器端是无法判断是...

2019-08-21 17:33:25 15953 3

原创 Linux | 线程同步--信号量、互斥锁和条件变量

一、线程线程是程序中完成一个独立任务的完整执行序列,即一个可调度的实体。Linux线程库:Linux上两个最有名的线程库是 LinuxThreads 和NPTL。用户可以使用如下命令来查看当前系统上所使用的的线程库getconf GNU_LIBPTHREAD_VERSION(我查了下自己的,发现我系统上使用的线程库是NPTL2.12)二、线程同步多线程程序...

2019-08-20 20:10:35 304

原创 MySQL--事务

什么是事务?事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。1. 为什么要讲InnoDB的事务呢?严格上来说,事务必须同时满足4个特性,即通常...

2019-08-16 12:14:07 207

原创 MySQL--索引

索引的概念索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。索引的建立是基于字段的(存储引擎的建立是基于表的)。一、基于两种存储引擎的索引1. 基于MyISAM的索引底层实现为B+树;数据和索引分离开,是非聚集索引;叶子节点上存放数据...

2019-08-14 20:37:37 221

原创 MySQL--存储引擎

存储引擎是一种基于表的对于文件的存取机制1. MyISAM不支持外键,不支持事务,支持全文索引;对于一些在线分析处理操作速度快,特点是表锁设计;采用非聚集索引的方式;文件组成:.myd 存放数据 .myi 存放索引2. InnoDB支持外键,支持事务,不支持全文索引;主要是面向在线事务处理方面的应用,特点是行锁...

2019-08-14 19:42:14 230

原创 Git的安装及使用

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git 是Linus Torvalds为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。安装Git 最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了 Windows上。现在,Git可以在Linux、Un...

2019-08-10 11:36:42 350

原创 MD5算法实现原理

最近知道了一个加密算法,在校验文件、验证签名安全等很有用。整理一下关于MD5的相关知识。(我不是知识的创造者,我只是知识的搬运工╭(●`∀´●)╯)MD5消息摘要算法(MD5 Message-Digest Algorithm)是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维...

2019-08-08 23:04:48 1132

原创 Linux | TCP拥塞控制原理

在学习TCP拥塞控制之前,我想向大家分享两个知识点。不知道大家有没有跟我一样的困惑,我们整天说着网络协议、TCP/IP协议了的,那么协议到底是什么呢?(是计算机领域的协议啦,不是其他方面的)协议:为进行网络中的数据交换而建立的规则、标准或约定称为网络协议,简称为协议。另外,还有一个专业术语“协议栈”,那么,这个又是什么呢?协议栈:网络中各层协议的总和;由于网络各层画在一起很像一个栈...

2019-08-05 21:49:48 592

原创 C++ | 顺序容器(vector、list、deque)

C++标准模板库提供三种顺序容器:vector,list 和deque。vector 类和 deque 类是以数组为基础的,list 类是以双向链表为基础的。1.vector图1 vector底层结构如图1所示,矢量 vector 类提供顺序表。下标运算符[ ] 有效。矢量可以用来实现队列、堆栈、列表和其他更复杂的结构。vector支持随机访问迭代子 。vector的迭...

2019-08-04 21:21:02 638

原创 C++ | 继承

继承作为C++三大特性之一,有着举足轻重的地位。下面是关于继承的一些知识点,可以帮助我们更好地学习和理解继承!!1. 继承的本质:代码复用 2. 继承和派生3. 派生类继承了基类的什么?派生类继承了基类除构造函数和析构函数以外的所有成员4. 派生类的内存布局如下图,base为基类,derive为派生类,派生类的内存布局如右边图形所示:在命令界面查看...

2019-08-02 23:46:00 210

原创 Linux | 三种I/O函数(select,poll和epoll)

在Linux下,实现IO复用的系统调用主要有 select,poll 和 epoll。1. select用途:在一段时间内,监听用户感兴趣的文件描述符上的可读、可写和异常等事件。(1)函数原型:int select(int nfds, struct fd_set *readfds, struct fd_set *writefds,struct fd_set *execptfd...

2019-08-01 20:32:30 517

原创 HTTP与HTTPS的区别

HTTP与HTTPS的概念1. HTTPHTTP,超文本传输协议,是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。(1)HTTP请求方法(2)HTTP协议的响应响应由三个部分组成:状态行、消息报头、响应正文。(3)HTTP应答状态码及状态信...

2019-07-31 19:50:29 1132

原创 数值的整数次方

题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路:这个题要求类似于库函数pow的功能。1. 在编写代码前,首先需要考虑三种情况:(1)输入的指数大于0;(2)输入的指数等于0;(3)输入的指数小于0;在数学中,我们学过任何数的0次方都为1;任何数的1次方都为它本身。2. 考虑完可能出...

2019-07-30 19:36:22 147

原创 高性能服务器程序框架3——并发模式

在探讨并发模式前,我们需要知晓什么是并发编程。并发编程的目的:让程序“同时”执行多个任务,提高效率。当一个程序是计算密集型时,并发编程并没有优势,反而由于任务的切换使效率降低。但是,当一个程序是I/O密集型时,采用并发编程会极大地提高CPU的利用率。因为I/O操作的速度远远小于CPU的计算速度,所以让程序阻塞于I/O操作上会浪费大量的CPU时间。而并发编程可以让阻塞于I/O操作的线...

2019-07-30 18:51:21 409

原创 高性能服务器程序框架2——事件处理模式

服务器程序通常需要处理三类事件:I/O事件、信号事件、定时事件。那我就有了一点疑惑,服务器是怎么来处理这些事件的呢?所以今天呢,就来说说两种高效的事件处理模式:Reactor模式和Proactor模式。通常使用同步I/O模型(select,poll,epoll 等)用来实现Reactor模式,而异步(aio_read 或aio_write 等)用来实现Proactor模式,不过还可以使...

2019-07-29 20:28:55 272

原创 高性能服务器程序框架1——I/O模型

在学习Linux高性能服务器程序框架时,学到了I/O模型。Linux下的五种I/O模型:阻塞I/O(blocking I/O) 非阻塞I/O (nonblocking I/O) I/O复用(I/O multiplexing) 信号驱动I/O ((SIGIO)signal driven I/O ) 异步I/O (asynchronous I/O关于同步与异步,阻塞与非阻塞的概念,在...

2019-07-28 23:46:58 314

原创 C++实现简单内存池

在探讨内存池前,我们需要回顾一下池的相关知识!池(pool):一组资源的集合。这组资源在服务器启动之初就被完全创建好并初始化,这称为静态资源分配。当服务器进入正式运行阶段,即开始处理客户请求的时候,如果处理该请求需要相关的资源,就可以直接从池中获取,无需动态分配。很显然,直接从池中取得所需资源比动态分配资源的速度要快很多,因为分配系统资源的系统调用都是很费时间的。当服务器处理完一个客户...

2019-07-27 21:42:49 273

原创 同步与异步、阻塞与非阻塞

一、同步与异步同步和异步关注的是消息通信机制同步:在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。异步:与同步相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果,而是在调用发出后,等被调用者准备好数据后反过来通知调用者。(回调)...

2019-07-26 21:37:52 134

原创 常用协议及端口号总结

现在 Internet 使用的主流协议族是 TCP/IP 协议族,这是一个分层、多协议的通信体系。对常用的协议端口号做一个总结,可以帮助我们更好的记忆!协议名 全称 端口号 简介 FTP 文件传输协议 20、21 提供有效地将文件从一台服务器移到另一台服务器的方法;20用于连接,21用于传输 SSH 安全外壳协议 22 专为远程...

2019-07-25 21:34:41 623

原创 C++ | 类中4个默认函数

类中4个默认的函数 函数名 简介 特点 构造函数 初始化对象所占的内存空间(赋资源) 可以重载 不依赖对象 不能手动调用 有 this 指针 析构函数 释放对象所占的资源 不可重载 依赖对象调用 手动调用(不建议,析构函数的调用退化普通函数的调用) 有 this ...

2019-07-24 23:44:26 324

原创 Linux | 进程创建--fork

1、fork 函数原型:pid_t fork(void);函数返回值类型为 pid_t,实质是 int 类型,Linux 内核2.4.0版本的定义是:typedef int _kernel_pid_t;typedef _kernel_pid_t pid_t;2、fork 函数的底层实现:fork()、vfork()和clone()的底层均调用do_fork(),只是传...

2019-07-23 23:58:44 175

原创 C++ | 函数重载

函数重载重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形参(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。符号生成规则:C语言:只与函数名有关C++:由3部分构成: 1. 函数返回值 ...

2019-07-22 23:47:33 182

原创 C++ | 面向对象思想(OOP)

面向对象的基本思想是:从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能地运用人类的自然思维方式。面向对象更加强调运用人类在日常生活的逻辑思维中经常采用的思想方法与原则,如抽象、分类,继承、聚合、多态等。OOP:面向对象编程,是一种计算机编程架构。OOP 的一条基本原则是:计算机程序是由单个能够起到子程序作用的单元或对象组合而成。如下图,将实体的属性和行为抽象为对...

2019-07-21 00:44:21 390

原创 C++ | new和malloc的区别

看过不少人的面经,经常问到 new 和 malloc 的区别。在探究 malloc和new的区别时,我们首先应该知悉这二者的基本概念与用法。malloc/free是C++/C语言的标准函数,new/delete是C++的运算符。1. malloc 和 free 的函数原型:void * malloc(size_t_size); //malloc 函数原型void * ...

2019-07-20 23:48:15 238

原创 C++ | 4G虚拟地址空间布局

最近复习到C++的虚拟地址空间布局,这是之前学习过的内容,但是有些忘记了。画图了解一下吧,图像便于记忆!(这里借用舍友饭_团画的图,博主已经在小本本上画过了,大家也要自己画一下。)虚拟内存,顾名思义,是虚拟的内存,不是真实存在的内存。操作系统给每个进程分配了4G的虚拟内存,而不是内存。也就是说程序运行时,操作系统先将相关的文件和数据从磁盘上读取,再通过地址映射到虚拟内存上,内存通过和虚...

2019-07-19 23:42:46 807

原创 C++ | 编译链接运行原理

源文件需要编译链接的原因:由于计算机只能识别机器语言,不能直接识别我们所编写的 .c 或 .cpp 文件。因此,需要将这些文件通过编译链接过程生成最终的可执行文件,使得计算机能够识别进而运行。编译链接的四个阶段:预编译、编译、汇编、链接。一、预编译阶段将源代码文件.c 或 .cpp 和相关的头文件.h 等预编译成一个 .i 文件gcc -E hello.c -o hel...

2019-07-17 23:32:13 226

原创 负载均衡

什么是负载均衡?当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理。那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题。负载均衡开...

2019-07-15 23:42:00 232

原创 红黑树的旋转、插入与删除

红黑树是一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是RED或者BLACK。通常对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是平衡的。树中的每个结点包含五个域:color、key、left、right、p。如果某结点没有一个子结点或父结点,则该结点相应得指针(p)域包含值NIL。我们将把这些 NIL 视为指向二叉查找树...

2019-07-14 23:41:34 342

原创 数据结构 | 队列

队列1. 队列的定义:队列是一个有序列表(ordered list),而且所有添加动作只能在一个特定的入口进行,删除动作只能在一个特定的出口进行。2. 队列的应用有: 计算机系统处理打印的工作。 CPU 提供的分时(time sharing)工作方式。 键盘缓冲区的应用。3. 队列的数据是有序列表, 而且是一个接着一个, 所以用数组来表示队列,按队列所要存放的数据...

2019-07-13 22:52:49 233

原创 数据结构 | 堆栈

堆栈1. 堆栈(stack)是一个抽象的逻辑结构,顾名思义它是将对象堆放在一起,一个一个往上叠放,但要取出时,则只能从最上层拿取,不能从中间取出对象。2. 堆栈的定义:堆栈是一个有序列表(ordered list),而且只能在一个特定的出入口进行数据的添加或删除。3. 以集合的角度来看堆栈,则有以下定义:如果集合 S = {a1,a2,...,ai,...,aj,...,an} 为...

2019-07-10 23:55:39 506

原创 位运算之二进制中1的个数

位运算是把数字用二进制表示之后,对每一位上0或1的运算。位运算有五种运算:与、或、异或、左移、右移。与、或、异或的运算规律 左移(<<) m << n 表示把 m 左移 n 位。在左移 n 位的时候,最左边的 n 位将被丢弃,同时在最右边补上 n 个0。例如:10001010 << 3 = 01010000右移(>>) ...

2019-07-09 23:09:27 301

原创 动态规划&贪婪算法之剪绳子

动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。1. 可以使用动态规划的情形:(1)在应用动态规划之前,要分析能否把大问题分解成小问题,分解后的小问题也存在最优解;如果把小问题的最优解组合起来能够得到整个问题的最优解,那么就可以应用动态规划解决这个问题。(2)如果是求一个问题的最优解(通常是求最大值或者最小值),而且该问题能...

2019-07-08 23:45:43 907

原创 回朔法之机器人的运动范围

回溯法可以看成蛮力法的升级版,它从解决问题每一步的所有可能选项里系统地选择出一个可行的解决方案。回溯法非常适合由多个步骤组成的问题,并且每个步骤都有多个选项。当我们在某一步选择了其中一个选项时,就进入下一步,然后又面临新的选项。我们就这样重复选择,直至到达最终的状态。【注:蛮力法,也称为穷举法或枚举法,是一种简单直接地解决问题的方法,常常直接基于问题的描述,所以,蛮力法也是最容易应用的方法。但...

2019-07-07 23:46:03 173

原创 C++ | this指针

关于 this 指针,有这样一段描述:当你进入一个房子后,你可以看见桌子、椅子、地板等,但是你却看不到房子全貌了。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this 指针就是这样一个时时刻刻指向该实例本身的指针。this 指针易混的几个问题如下:(1) this 指针本质是一个函数参数,只是编译器隐藏起形式的、语法层面上的参数。this 指针只能在成员函数...

2019-07-06 23:42:09 147

原创 数据结构 | 链表

链表相关知识点:1. 列表的定义:列表(List)的抽象概念是指一组相同数据类型元素的有序集合。2. 链表的定义:链表(link list)是一种有顺序的列表,且数据项应包含链接(link),链接可以链接到其他数据项,此数据项称为节点,其形式为:3. 链表有以下的特性: 链表一般可以用数组或结构形式来表示。 节点顺序在内存中的实际地址可以不连续,或者是经由随机配...

2019-07-06 12:13:01 110

原创 数据结构 | 数组

数组相关知识点:1. 数组的定义:数组的抽象定义是一组具有相同数据类型的元素所组成的有序集合。在计算机中的物理分配空间中,数组通常存放在一块连续的内存中。数组包含名称和下标,下标只有一个时,称为一维数组;下标有两个时,称为二维数组;依此类推,有n个下标就称为n维数组。2. 数组计量:指计算数组的存储空间数或所占字节数。数组存取数据是以下标为单位的,所以元素个数相当于下标的个数;而数组有数据...

2019-07-04 23:04:26 152

空空如也

空空如也

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

TA关注的人

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