自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【剑指offer】4.3 具体让抽象问题具体化

面试题21:包含min函数的栈题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。解答:代码如下:stack<int> ValSta;stack<int> MinSta;void push(int value){ ValSta.push(value); if(...

2019-09-04 10:27:35 311

原创 【剑指offer】4.2 画图让抽象问题形象化

面试题19:二叉树的镜像题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};解答:代码如下:void Mirror(BinaryTreeNo...

2019-09-01 10:40:56 286

原创 【剑指offer】3.4 代码的鲁棒性

面试题15:链表中倒数第k个结点题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。链表结点定义如下:struct ListNode{ int m_nValue; ListNode* m_...

2019-08-31 20:49:52 283

原创 【剑指offer】3.3 代码的完整性

面试题12:数值的整数次方题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。解答:代码如下://判断两个浮点数是否相等有误差,需要特殊处理bool equal(double num1,double num2){ bool res = false; if((num...

2019-08-31 16:53:06 194

原创 【剑值offer】2.4.3 位运算

面试题12:二进制中1的个数题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。解答:代码如下:int NumberOf1(int n){ int count = 0; while(n != 0) { n &= (n - 1); count++; } ...

2019-08-30 10:29:17 183

原创 【C语言】volatile关键字

举例说明: volatile int i=10; int j = i; ... int k = i; volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。 volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与...

2019-08-13 17:31:41 358

转载 【Linux】fork()、vfork()、clone()的区别

Linux的用户进程不能直接被创建出来,因为不存在这样的API。它只能从某个进程中复制出来,再通过exec这样的API来切换到实际想要运行的程序文件。 复制的API包括三种:fork、clone、vfork。这三个API的内部实际都是调用一个内核内部函数do_fork,只是填写的参数不同而已。 vfork,其实就是fork的部分过程,用以简化并提高效率。而fork与cl...

2019-08-10 11:05:03 437

原创 【MySql】MySql中的存储引擎、索引、事务

一、存储引擎 MySql的存储引擎是MySql底层对于文件的一种存取机制。存储引擎的建立是基于表的。 1.MyISAM 一、存储引擎 MyISAM 是 MySQL 的默认存储引擎。MyISAM 不支持事务、也不支持外键,支持全文索引。数据文件和索引文件放置在不同的目录(非聚集索引),平均分布 I/O,获得更快的速度。MyISAM支持表锁,表生成三个文...

2019-08-10 10:40:10 843

原创 【Linux系统编程】守护进程

守护进程又称精灵进程,常常在系统启动时自启,仅在系统关闭时才终止,生存期比较长!一般都是在后台运行,不需要和用户交互。 可通过ps -axj命令查看常用系统守护进程,其中最为常见的init进程,负责各运行层次间的系统服务。 在说守护进程编程流程之前先来了解几个概念: 会话:一个或多个进程组的集合。用户从登录到退出期间的所有进程都属于一个会话期。会话id = 会...

2019-08-01 19:59:30 440

原创 【C++】面向过程和面向对象思想

一、面向过程 面向过程就是对解决问题的过程进行编程。比如我们在学习和生活中去实现某项功能或完成某项任务时,一般都会不自觉地按部就班地罗列出我们要做的事情。当我们按照罗列的步骤去解决问题时,实质上就是按照面向过程思想去解决问题。我们罗列的步骤就是过程,按照步骤解决问题就是面向过程。 传统的面向过程的编程思想总结起来就是八个字--自顶而下,逐步细化!实现步骤如下: ...

2019-07-26 20:10:29 764

原创 【C++】struct和class的区别

struct和class的区别 1.C语言中无法使用struct定义空结构体,而C++中可以使用class定义空类,其大小为1 2.struct默认的成员访问权限是public,而class默认的成员访问权限是private 3.struct默认的继承访问权限是public,而class默认的继承访问权限是private 4.class可用于定义模板参数,而...

2019-07-21 10:47:01 372

原创 【C++】宏、inline函数、static修饰的函数、普通函数的区别

宏和inline函数的区别 1、 宏是编译阶段处理的,纯粹是字符串替换(坑确实很多,尤其是在表达式替换的时候),没有任何的类型检查等,十分的不安全;而 inline 函数的处理是发生在编译阶段的,有完整的语句类型检查,比宏更安全 2、 宏是无法调试的, inline 函数在 debug 版本下和普通函数一样,出了问题很方便进行断点调试,定位问题 3、 大量的宏很不方便去阅...

2019-07-21 10:28:08 418

原创 【C++】const用法总结

一、C语言中 1.const修饰的是常变量,存放在代码段,仅仅是在编译阶段看常变量是否做左值,其他处理和普通变量一样; 2.若修饰全局变量,其属性是global。 二、C++中 1.const修饰的量称为常量,在编译阶段将用到常量的地方替换成常量初始化的值; 注:(1)一定要初始化,因为要做替换;(2)不能做左值;(3)不能间接修改,杜绝间...

2019-07-20 19:03:10 207

原创 【C++】函数调用堆栈

函数调用堆栈过程: 1.实参从右向左入栈,为形参初始化; 2.将下一条指令地址入栈; 3.压入调用方函数的栈底指针寄存器的值,即栈底地址; 4.将edp移动到被调用方栈底; 5.跳转到被调用方函数栈帧,开辟被调用方函数的运行空间,并初始化为0xcccc cccc。...

2019-07-20 18:44:19 598

原创 【C++】函数调用约定、函数返回值的返回方式

C++函数调用约定有4种: 1._cdecl C标准调用约定,也是默认调用约定 2._stdcall Windows下的标准调用约定 3._fastcall 快速调用约定 4._thiscall 类成员方法的调用约定_cdecl调用约定生成的函数符号:?函数名@@YAHHH@Z YA代表_cdecl函数约定,YG代表_stdcall函数约定,Y...

2019-07-20 18:04:01 719

原创 【C++】同名函数的关系

1.重载 overload:同作用域、同函数名、参数列表不同。 同函数名保证统一接口。返回值不同不能构成重载,因为在参数列表相同的情况下,编译器不知道调用哪一个函数。因此重载是靠形参提供支持的,包括不同的形参个数以及类型。 2.隐藏(重定义) overhide:在继承关系下的不同作用域中,子类中的同名函数隐藏了父类中所有的同名函数。隐藏后父类中同名函数无法访问,若要访问...

2019-07-20 11:42:15 398

原创 【C++】写时拷贝技术(copy-on-write)

写时拷贝的思想是在复制原来的内容时,如果复制后不会对原来的内容做出改变(即只读),就不会直接复制过去,而是建立一个指针指向原来的内存,也就是浅拷贝。如果要修改原来内存上的内容,就需要重新分配内存并将原来内存上的内容拷贝到新内存上,再进行修改,即深拷贝。 1.C++的写时拷贝技术 C++中的写时拷贝技术是通过“引用计数”来实现的。也就是说,在每次分配内存时,会多分配4个字...

2019-07-19 19:50:37 1002

原创 【Linux】Linux下的写时拷贝技术(copy on write)

在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会执行exec系统调用,出于效率考虑,Linux中引入了“写时拷贝”技术,也就是只有进程空间的各段的内容要发生改变时,才会将父进程的内容复制一份给子进程。 那么子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢? 在fork()之后exec()之前两个进程用的是相同的物理空间(...

2019-07-19 19:47:21 731

原创 【Linux】Linux下4G虚拟地址空间布局

32位系统下进程的虚拟地址空间大小为4G(2^32=4G),32位是指地址总线的条数。在Windows中以2:2划分内核、用户空间,而在Linux中则以1:3划分内核、用户空间。Linux中4G虚拟地址空间分布图如下: 下面是一些实例:int gdata1 = 10;//.data段int gdata2 = 0;//.bss段:best save space,节省磁盘...

2019-07-18 19:42:18 695

原创 【C++】预编译、编译、汇编、链接

首先思考下面的问题:为什么要有编译链接呢? 有两点原因:1.编译器无法直接运行.c和.cpp文件,因此需要将源文件转化为计算机可以识别的二进制文件;2.如果想要运行一段代码,就会产生进程,进程是在内存中,而源文件存放在内存中,因此需要编译链接,将文件加载到内存中,CPU才能执行。 编译链接分为4个阶段,接下来具体看每个阶段做了什么事情。 1.预编译-->...

2019-07-18 19:18:12 704

原创 【数据结构】二叉搜索树(BST树)的定义、构建、插入、删除及查找操作

一、概念 二叉搜索树(BST树):又叫二叉排序树,二叉查找树。它或者是一棵空树;或者是具有以下性质的二叉树: 1.每个结点都有一个数据域,且所有节点的数据域互不相同; 2.若它的左子树不为空,则左子树上的所有结点的值都小于根节点的值; 3.若它的右子树不为空,则右子树上的所有节点的值都大于根节点的值; 4.左子树和右子树都是二搜索树。 对二叉搜索树...

2019-06-30 21:12:14 2739

原创 【剑指offer】2.4.2 查找和排序

面试题11:旋转数组的最小数字题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。解答:和二分查找一样,我们用两个指针分别指向数组的第一个元素和最后一个元素。接着找到数组中间的元素。如果该中间元素大于或者等于第一个指针指向的元...

2019-06-29 18:16:32 244

原创 【剑指offer】2.4.1 递归和循环

如果面试题要求在二维数组(可能具体表现为迷宫或者棋盘等)上搜索路径,那么可以尝试用回溯法。通常回溯法很适合用递归的代码实现。只有当面试官限定不可以用递归实现的时候,可以在考虑用栈来模拟递归的过程。 如果面试题是求某个问题的最优解,并且该问题可以分为多个子问题,那么可以尝试用动态规划。在用自上而下的递归思路去分析动态规划问题的时候,就会发现子问题之间存在重叠的更小的子问题。为了避免...

2019-06-28 21:35:02 199

原创 【剑指offer】2.3.5 栈和队列

面试题9:用两个栈实现队列题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。解答:当stack2不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出。当stack2为空时,就把stack1中的元素逐个弹出并压入stack2。由于先进入队列的元素被压倒stack1的底端...

2019-06-27 20:28:20 200

原创 【剑指offer】2.3.4 树

面试题7:重建二叉树题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如:输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建如下图所示的二叉树并输出它的头节点。二叉树节点的定义如下:struct BinaryTreeNode{ int m_nValue;...

2019-06-26 21:56:49 172

原创 【剑指offer】2.3.3 链表

面试题6:从尾到头打印链表题目:输入一个链表的头节点,从尾到头反过来打印出每个结点的值。链表结点定义如下:struct ListNode{ int m_nKey; ListNode *m_pNext;};解答:从题目可知,第一个遍历到的结点最后一个输出,而最后一个遍历到的结点第一个输出。这就是典型的“先进后出”,可以用栈来实现这种顺序。代码如下:vec...

2019-06-24 20:07:23 185

原创 【剑指offer】2.3.2 字符串

面试题5:替换空格题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出“We%20are%20happy.”。解答:我们可以先遍历一遍字符串,统计出字符串中空格的数目,由此计算出替换后字符串的长度。可以从字符串的末尾开始复制和替换。首先准备两个指针p和q,p指向原始字符串的末尾,q指向替换后字符串的末尾。接下来向前移动指针p,逐个把它...

2019-06-24 18:07:59 154

原创 【剑指offer】2.3.1 数组

面试题3:数组中重复的数字题目一:找出数组中重复的数字。 在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如:如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。解答:方法1:先对输入的数组排序,然后从头开始扫描数组,找到重...

2019-06-22 20:53:42 168

原创 【剑指offer】2.2 编程语言

面试题1:赋值运算符函数题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。class CMyString{public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString();private: char* m_pData;...

2019-06-21 12:09:31 1025

原创 【C语言】指针和数组的区别

指针和数组的区别 1.概念 数组是用于存储多个相同类型数据的集合;指针相当于一个变量,它存放的是其他变量在内存中的地址。 2.赋值方式 同类型的指针变量可以相互赋值,数组不行,只能一个元素一个元素赋值或拷贝。 3.存储方式 数组在内存中时连续存放的,开辟一块连续的内存空间;指针可以指向任意类型的数据,指针的类型说明了它所指向地址空...

2019-06-11 11:55:48 489

原创 【C语言】指针和引用的区别

指针和引用的区别 1.指针是一个实体,而引用是一个别名;在汇编上,引用的底层是以指针的方式实现的,定义一个引用变量,相当于就是定义了一个指针,然后把引用内存的地址写到这个指针里面,当通过引用变量修改它所引用的内存时,它先访问了指针里面的地址,然后在这个地址的内存里面对值进行修改 2.指针可以不初始化,通过赋值可以指向任意同类型的内存;但是引用必须初始化,而且引用一经引用一块内存...

2019-06-11 11:40:34 9203

原创 【C++】new和malloc的区别

new和malloc的区别 1.申请的内存所在位置 new操作符从自由存储区上为对象动态分配内存空间,而malloc从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new进行内存申请,该内存即为自由存储区。而堆是操作系统所维护的一块特殊内存,用于程序的动态内存分配。C语言使用malloc从堆上分配内存,使用free释放对应内存。 ...

2019-06-11 11:24:27 1982

原创 【C语言】堆和栈的区别

在不同情境下,堆和栈代表不同的含义。一般有两层含义:(1)程序内存布景场景下,堆和栈代表的是两种内存管理方式;(2)数据结构场景下,堆和栈表示两种常用的数据结构。 1.数据内存分布中的堆与栈 栈由操作系统自动分配释放,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈。堆由程序员分配释放,若程序员不分配释放,程序结束时由操作系统回收,其分配方式类似于链表。...

2019-06-10 21:26:44 3416 1

原创 Linux源码剖析--fork()

fork()的功能是复制进程,首先我们要清楚进程是什么。进程是一个正在运行的进程,是资源分配的最小单位。系统对进程的管理是通过对进程控制块(PCB)的管理实现的。每个进程的产生分为两步:1.分配PCB;2.准备进程实体,如分配内存空间等。 fork()、pthread_create()、vfork()对应的系统调用分别是sys_fork(),sys_clone(),sys_vfo...

2019-06-09 10:13:59 745

原创 【Linux系统编程】线程基础

线程的概念 线程是进程内部的一条执行序列,或者执行流。每个进程至少有一条线程,称之为主线程。从代码的角度看,就是main函数的函数体。在主线程中可以通过线程库创建其他函数线程。在同一个进程中的线程都是并发运行的,并且线程的执行顺序由系统决定。 主线程和函数线程没有本质的区别,只是主线程是进程执行时的第一条线程。主线程默认结束,结束的是整个进程。 线程的...

2019-04-13 10:08:19 135

原创 【Linux系统编程】线程的创建

线程的创建 线程库的头文件包含在头文件pthread.h中: 线程创建函数:int pthread_create(pthread_t *id,pthread_attr_t* attr,void*(*pthread_fun)(void*),void* arg); pthread_fun函数是一个线程函数,即新创建的线程的执行体。pthread_creat...

2019-04-13 10:07:46 336

原创 【Linux系统编程】进程间通讯--共享内存

共享内存区域说白了就是多个进程共享的一块物理内存地址,只是将这块物理内存分别映射到自己的虚拟地址空间上。假设有10个进程将这块区域映射到自己的虚拟地址上,那么,这10个进程间就可以相互通讯。由于是同一块区域在10个进程的虚拟地址上,当第一个进程向这块共享内存的虚拟地址中写入数据时,其他9个进程都会看到。但是进程之间使用这块共享内存时,必须通过信号量做同步控制。管道和消息队列由操作系统来控...

2019-04-12 17:35:02 277

原创 【Linux系统编程】进程间通讯--消息队列

多进程在进行通讯时,有时可能需要数据的定向发送。比如进程A向管道文件中写入数据"helloworld",意将"hello"发送给进程B,将"world"发送给进程C,怎么做到呢?这就需要消息队列。 消息队列的特点: 1.消息队列是消息的链表,具有特定的格式:类型+数据。存放在内存中,由消息队列标识符标识。 2.消息队列允许一个或者多个进程写入或读取消息...

2019-04-12 17:30:39 196

原创 【Linux系统编程】进程间通讯--信号量

在学习信号量之前先来看几个概念: 临界资源:同一时刻只允许一个进程访问的资源。 临界区:访问临界资源的代码段。 原子操作:不可被打断的操作,没有中间状态。 进程同步:进程间协同工作。 进程异步:进程间独立运行,互不干扰,需要内核机制来通知。 在多进程编程中,会存在多个进程同时访问同一个临界资源的情况。比如变量i的初始值为0,进程...

2019-04-12 09:25:48 422

原创 【Linux系统编程】进程间通讯--管道

首先我们可以思考一下,为什么有多进程编程?通俗来讲,多进程编程是为了让多个子任务同时并发运行,并且彼此间协调工作,以完成一个更大的任务,而不仅仅是数据的增加。而进程间都是相互独立的,要完成进程间通讯,必须共享一些资源。由此引出了进程间通讯的几种方式:管道、信号量、消息队列、共享内存、socket。其中前四种是同一台主机上进程间通讯,最后一种是不同主机上进程间通讯。socket套接字在后边的...

2019-04-11 21:11:17 209

空空如也

空空如也

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

TA关注的人

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