自定义博客皮肤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)
  • 收藏
  • 关注

原创 字符串部分逆置

这道题很久以前写过,字节跳动一面的时候也让写的是这道题,所以还是写出来了哈哈哈把www.toutiao.com逆置成com.toutiao.www#include<iostream>#include<string>using namespace std;void reverse_str(string &str, int low, int high){...

2019-08-21 11:59:36 771

原创 C++设计模式 ---- 单例模式

设计模式概念设计模式就是在解决某一类问题时,有一个既定的、优秀的代码框架可以直接使用。优点如下:代码更易于维护,代码的可读性,复用性,可移植性,健壮性会更好到软件的原有需求有变更或者增加新的需求时,合理的设计模式的应用,能够做到软件设计要求的“开—闭原则”,即对修改关闭,对扩展开发,使软件原有功能修改,新功能扩充非常灵活合理的设计模式的选择,会使软件设计更加模块化,积极的做到软件设计遵...

2019-08-13 19:54:33 314

原创 线程间同步 ---- 信号量、互斥锁

一、线程了解线程间同步方法之前,还是要弄清楚线程是什么。1、线程概念线程是进程内部的一条执行路径或者序列,是CPU调度的基本单位。进程是一个正在运行的程序,是资源分配的基本单位。2、操作系统中的线程在操作系统中将线程的实现分为了三类用户级线程:创建开销小,线程库自己管理,不需要内核管理,无法使用多个处理器,最多只能做到并发内核级线程:创建开销大,由内核直接管理,可以使用多个处理器...

2019-08-08 12:40:12 542

原创 排序算法--堆排、基数

一、堆排序1、概念和思想选择排序是在待排序的n个记录中选择一个最小的记录需要比较n-1次,而且选择排序并没有把每一趟的比较结果保存下来,在后一趟的比较中,有多次比较可能在前面几趟已经比较过了。但是因为每一趟都没有保存比较结果,所以导致后面会有多次重复比较。堆排(Heap Sort),是对选择排序进行的一种改进。堆是具有下列性质的完全二叉树:每个节点的值都大于或等于其左右孩子结点的值,称为大...

2019-08-05 13:06:57 531

原创 排序算法--选择,快排,归并

一、选择排序1、概念和思想简单选择排序(Simple Selection Sort)就是通过 n - i 次关键字间的比较,从n - i + 1个记录中选出关键字最小的记录,并和第 i (1 <= i <= n)个记录交换之。2、排序过程分析排序过程简单来说,就是每次选择第i个元素做为关键字,然后从 i + 1 开始依次遍历后面的元素,如果比 i 对应的元素小,就进行交换。...

2019-07-29 22:51:25 301

原创 排序算法--冒泡、直接插入,shell

一、排序的概念和基本分类1、概念假设含有 n 个记录的序列为{r1,r2,······,rn},其相应的关键字分别为{k1,k2,·····,kn},需确定1,2,······,n的一种排列p1,p2,······,pn,使其相应的关键字满足kp1<=kp2<=·······<=kpn(非递减或非递增关系),即使得序列成为一个按关键字有序的序列{rp1,rp2,······,...

2019-07-26 22:51:01 242

原创 位运算解决常见问题--求二进制中1的个数,判断是否是2的次幂等

1、什么是位运算?学计算机的人应该都知道,计算机内部都是以二进制来计算的。那么什么是二进制?我们日常用到的都是十进制,而所谓的十进制就是逢10进1。二进制中只包含0和1,逢2进1。常见的进制还有,八进制,十六进制,二十六进制等。而位运算就是直接在二进制的数字序列上进行按位与,按位或,按位异或,左移,右移这几种操作。由于计算机内部本身就是以二进制在运算,所以位运算相较算数运算符来说,计算起来就...

2019-07-17 18:05:01 520

原创 并查集、及并查集解决常见朋友圈等问题!

目录一、什么是并查集?二、简单的并查集实现三、利用并查集解决一些问题一、什么是并查集?并查集是一种树型的数据结构,用于处理两个没有交集的集合的合并或者查找问题。由它的名字就可以看出,它的主要操作一是合并,二是查找。初始时,所有的元素都不相交。通过多次的合并,最终会合并成多个集合或者一个大集合。实现并查集一般要借用一个数组来存放每个元素对应的集合特征。主要操作就是合...

2019-07-10 16:46:53 1316

原创 Linux进程间通信(IPC) ---- 套接字

目录一、什么是套接字?二、如何通过套接字来维持一个连接的?三、套接字属性四、创建套接字五、关于套接字的其它系统调用进程间通信的方式有:管道、套接字、共享内存、消息对列、信号量管道,信号量,共享内存见之前博客。套接字:是管道概念的一个扩展,Linux系统支持套接字接口。可以通过使用管道类似的方法来使用套接字,套接字还包括计算机网络中的通信,常用于网络编程。Wind...

2019-07-08 19:40:03 437

原创 LeetCode ---- 缺失数字

给定一个包含 0, 1, 2, ..., n中n个数的序列,找出 0 .. n中没有出现在序列中的那个数。示例 1:输入: [3,0,1]输出: 2示例2:输入: [9,6,4,2,3,5,7,0,1]输出: 8题目说明:你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?这道题我的思路其实并不丰富,最初想的就是自己建一个比传到函数中的vector...

2019-06-28 18:15:54 189

原创 C/C++中const的区别、以及const和一级二级指针的结合

最初认识const当然是在C语言中,做为C语言的一个关键字,它在我们编程中经常用到,比如字符串相关的库函数的实现等。在C语言中,对于const的理解就是const修饰谁,谁就不能被改变。基于对句话的理解,使我在C++const和指针的结合中对const越来越迷。毕竟C和C++中的const还是有巨大差别的。言归正传,先来说一下C中的const。**C语言中的const**const修饰的...

2019-06-26 22:27:08 446

原创 深入理解程序编译链接原理

目录一、预编译二、编译三、汇编四、链接五、ELF文件格式1、ELF文件类型2、ELF文件存储形式3、ELF文件格式4、可执行文件和目标文件格式上的区别5、符号表编译一道程序时,编译器会经过哪些过程呢?这个过程绝大多数人都耳熟能详,什么预编译,编译,汇编,链接,最后在运行。事实上,确实是这几个步骤,但是这几个步骤分别干了些什么呢?简单说来:预编...

2019-06-23 19:03:24 713

原创 LeetCode----搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。可以假设数组中无重复元素。示例 1——输入: [1,3,5,6], 5 输出: 2示例2——输入: [1,3,5,6], 2 输出: 1示例 3——输入: [1,3,5,6], 7 输出: 4示例 4——输入: [1,3,5,6], 0...

2019-06-21 20:34:49 162

原创 静态库与动态库的区别

什么是库?库就是预先编译好的方法或者函数的集合,且都具有一定的成熟度。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。事实上,我们平常写的代码多多少少都会用到库中的函数,所以库中的代码我们是可以复用的,从而提高程序运行效率。库主要分为静态库和共享库(也可称为动态库),所谓的静态和动态是指链接阶段如何处理库。静态库1、Linux下静态库名为 libxxx.a...

2019-06-10 21:24:43 259

原创 epoll源码剖析(Linux Kernel 2.6.11)

本篇文章是基于Linux Kernel 2.6.11的源码来展开的。epoll简介之前我的博客里也写到过,epoll是Linux特有的I/O复用函数。它在实现上与select、poll有很大差异。它的提出是为了弥补select和poll对于描述符过多处理时时间效率过高的问题。可以参考https://mp.youkuaiyun.com/postedit/89601608三种IO函数中:sel...

2019-05-26 23:42:05 541

原创 Linux ---- 进程和其相关函数fork、exec和wait

进程是Linux操作系统环境的基础,它控制着系统上几乎所有的活动。目录1、什么是进程2、进程四要素3、关于进程的命令4、进程的结构5、fork6、exec系列系统调用7、do_fork()8、wait()9、进程终止1、什么是进程UNIX标准把进程定义为:“一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源”。进程是UNIX操作...

2019-05-22 21:15:04 523

原创 剑指offer ---- 从尾到头打印链表

题目:输入一个链表的头结点,从尾到头反过来打印输出每个节点的值。由于链表的结构它是一个结点指向下一个结点的,所以如果可以改变链表的结构,那么将链表中的各指针反转过来,改变链表的方向,这样输出来的结果也符合题意要求。但是这个相当于给链表先进行了一次反转,再输出。实现比较复杂,因为本身链表的反转就很不好想了。所以在不改变链表结构的情况下,还要实现链表中的数据从尾到头打印,我们可以借助栈来实现。...

2019-05-21 19:47:13 183

原创 LeetCode ---- 合并两个有序链表

这是我刷了这么久LeetCode以来,最让我无语的一道题。合并两个有序链表,题确实不难。写完之后,一直编译不过,出现下面的傻逼问题,合并完之后就是少一个数。分析了两遍,甚至画了整个代码合并过程的图,觉得代码没有什么问题。但还是运行不过,让我真的很难受。实在没办法,就去VS下写了完整的单链表合并,一模一样的代码,VS下面运行出来的结果一点毛病都没有。让我真的有一点怀疑,LeetCode里面的编译...

2019-05-19 20:20:48 192

原创 给我儿子讲的一道递归题!

首先看一下题目要求:写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19 。给这个狗der讲的时候,我真的快要气炸了。首先,他不明白递归什么时候该返回,其次他不明白怎么样累加。那么递归是什么?简单来说,递归就是在自己函数体内继续调用自己,直到某一刻递归到最底层了开始逐层返...

2019-05-17 15:17:22 302

原创 Linux进程间通信(IPC) ---- 共享内存

目录共享内存定义共享内存的同步机制shmget函数shmat函数shmdt函数shmctl函数不使用信号量对共享内存进行同步操作使用信号量对共享内存进行同步操作共享内存定义共享内存允许两个不相关的进程访问同一块逻辑内存。因为数据不需要在进程之间复制,所以共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。大多数共享内存的具体实现,...

2019-05-16 18:15:25 248

原创 Linux进程间通信(IPC) ---- 信号量(semaphore)

上一篇博客中说到了进程间通信的第一种方式—管道(pipe),管道的通信方式是半双工的,在同一时间只能读或者写。这一篇博客来简略的说一下进程间通信的第二种方式—信号量。那么,什么是信号量?什么是PV操作?什么又是临界区和临界资源?目录信号量Linux的信号量机制1、semget函数2、semop函数3、semctl函数4、无信号量控制,两个程序并发运行访问临界资源...

2019-05-15 23:50:01 649

原创 Linux进程间通信(IPC) ---- 管道(pipe)

目录管道1、什么是管道?2、shell命令下的管道3、进程管道4、pipe函数5、有名管道和无名管道的区别6、当管道的一端被关闭后,会发生什么样的事情?7、使用write、read函数实现简单的管道通信 进程间通信就是在进程间交换信息,之前的方法只能是由fork或exec传送打开文件,或者通过文件系统。但是在UNIX系统和Linux系统中还有别的方...

2019-05-12 20:35:20 302

原创 MySQL基本操作 --- 创建、删除数据库及表的创建、修改和删除

目录一、操作数据库1、创建数据库2、删除数据库3、数据库存储引擎(存储引擎就是指表的类型,数据库的存储引擎决定表在计算机中的存储方式)二、创建、修改和删除表1、创建表2、设置表的主键3、设置表的外键4、设置表的非空约束5、设置表的唯一约束6、设置表的属性值自动增加7、设置表的属性的默认值8、查看表9、修改表10、删除字段11、修...

2019-05-11 19:56:13 4757

原创 MySQL基本数据类型

目录MySQL基本数据类型1、整数2、浮点数和定点数3、日期与时间类型4、字符串类型5、二进制类型MySQL基本数据类型整数 浮点数 定点数 日期与时间类型 字符串类型 二进制类型1、整数标准库SQL支持INTEGER和SMALLINTMySQL支持:各类型默认显示宽度(默认与有符号数的最小值的显示宽度相同)2、浮点数和...

2019-05-10 15:50:14 255

原创 C++ 继承与多态(二)

1、析构函数能不能实现成虚函数? 可以。 在析构函数中调用virtual虚函数,是动态绑定。2、不能在构造函数前加virtual,因为只有通过调用构造函数才有对象。 在构造函数中调用virtual虚函数,不能发生动态绑定。因为动态绑定需要访问对象的前四个字节(即虚函数表的地址),构造函数还没结束的时候对象还没有产生。3、类的静态成员方法,能不能写成虚...

2019-05-03 19:16:16 332

原创 Linux网络编程 ---- 三组I/O复用函数的比较

三组I/O复用函数包括select、poll、epoll,这三组系统调用都能同时监听多个文件描述符。它们将等待由timeout参数指定的超时时间,直到一个或者多个文件描述符上有事件发生时返回,返回值是就绪的文件描述符的数量,返回0表示没有事件发生。这3组函数都通过某种结构体变量来告诉内核监听哪些文件描述符上的哪些事件,并使用该结构体类型的参数来获取内核处理的结果。select的参数fd_s...

2019-05-03 15:44:11 349

原创 网易内推面试题 ---- 分苹果问题

n 只奶牛坐在一排,每个奶牛拥有 ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1。输入描述:每个输入包含一个测试用例。每个测试用例的第一行包含一个整数 n(1 <= n <= 100),接下来的一行包含 n 个整数 ai(1 &l...

2019-04-29 21:17:51 449

原创 网易内推面试题 ---- 挑选"9706"串

有一天,小明在游戏中获得了一串数字,直觉告诉他这不是一串普通的数字串,或许可以破解一些关于网易的秘密。破解的第一步,他很想知道,在这串数字中,最多可以挑出多少个’9706’串。挑选的规则为:(1)挑出的数字’9’,’7’,’0’,’6’在原串中可以不连续,但是数字的先后顺序不能改变(2)使用过的数字不能被再次使用。如’123901370997606’可以最多挑出2个’9706’,而’607...

2019-04-29 21:04:24 261

原创 LeetCode ---- 二分查找使用C和C++实现

二分查找又叫折半查找,这个查找算法的查找前提必须是数组内值有序。给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在nums中并且下标为 4示例2:...

2019-04-28 18:06:09 357

原创 Linux网络编程 --- IO复用之epoll系统调用详解

epoll简介epoll是Linux特有的I/O复用函数。它在实现上与select、poll有很大差异。它的提出是为了弥补select和poll对于描述符过多处理时时间效率过高的问题。epoll使用一组函数来完成任务,而不是单个函数。epoll_createepoll_create(int size)//创建内核事件表 epoll_ctl();//向内核事件表中...

2019-04-27 20:59:44 727

原创 Linux网络编程 --- IO复用之poll系统调用详解

poll系统调用和select系统调用相似,也是在指定时间内轮询一定数量的文件描述符,以测试其中是否有就绪者。poll系统调用原型:#include<poll.h>int poll(struct pollfd* fds,nfds_t nfds,int timeout);1、fds参数是一个pollfd结构类型的数组,它指定所有我们感兴趣的文件描述符上发生的可读、可写和异...

2019-04-22 17:50:45 489

原创 Linux网络编程 --- IO复用之Select系统调用详解

I/O复用技术使得程序能同时监听多个文件描述符。通常网络程序在下列情况下需要使用I/O复用技术。客户端程序要同时处理多个socket。 客户端程序要同时处理用户输入和网络连接。 TCP服务器要同时处理监听socket和连接socket。 服务器要同时处理TCP请求和UDP请求。 服务器要同时监听多个端口,或者处理多种服务。Linux下I/O复用技术使用select、poll和e...

2019-04-20 22:43:10 491

原创 C++ 继承与多态(一)

面向对象编程基于三个基本概念:数据抽象、继承和动态绑定。C++中用类进行数据抽象;用类派生一个类使得派生类继承基类的成员。动态绑定是编译器能够在运行时确定是使用基类中定义的函数还是派生类中定义的函数。面向对象编程的关键思想是 :多态性。之所以称通过继承而相关联的类型为多态类型,是因为在很多情况下可以互换地使用派生类或者基类型的“许多形同”。在C++中,多态性仅用于通过继承而相关联的类型的引用或...

2019-04-20 17:13:51 384

原创 C++STL容器 ---- 顺序容器之deque、list

顺序容器2---deque:双端队列1、Deque(doubled-ended queue)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。 底层数据结构:动态开辟的二维数组,和vector的底层数据结构不同,deque的第二维是按固定大小开辟的,内存扩容时,扩容第一维的数组空间,每次按原空间2倍方式进行扩容,然后把第二维...

2019-04-17 17:31:56 888

原创 C++STL容器----顺序容器之vector

容器是C++ STL(标准模板库)六大组件之一,为我们代码的实现提供了诸多便利。容器的分类及相关内容有顺序容器、容器适配器、关联容器一、顺序容器顺序容器:是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序容器中的每个元素均有固定的位置,除非用插入或者删除的操作来改变这个位置。这个位置和元素本身无关,而和操作的时间地点有关。顺序容器不会根据元素的特点排序而是直接保存了元素...

2019-04-17 00:05:08 315

原创 网易笔试题:实现大数的加法!

首先来看一下题目:// 大整数类型class BigInt{public: BigInt(string str) :strDigit(str){}private: string strDigit; // 使用字符串存储大整数};// 打印函数ostream& operator<<(ostream &out, const BigInt &amp...

2019-04-13 14:11:13 337

原创 C++ new和delete原理及应用!

C语言中我们在堆上开辟内存时,用到的是malloc和free,可是在C++中却引入了新的开辟内存和释放内存的方法,即new和delete。那么它们之间有什么不一样,原理又是怎样的呢?一、malloc/free和new/delete的区别?1、malloc和free是函数,new和delete却是C++的运算符。2、malloc只能开辟空间,new既能开辟空间还可以初始化。new一次会调...

2019-04-08 17:20:27 2378 1

原创 C++智能指针!

一、什么是智能指针?什么是裸指针?1、了解智能指针之前,我们先了解什么是裸指针?凡是带*的都是裸指针,也就是我们C和C++中一直接触的指针。但是指针虽然好用,但是当它在堆上开辟内存之后,如果使用之后处理不当都会引起一系列的问题。比如:(1)如果得不到及时的手动释放,会造成内存泄漏。(2)多次释放同一块资源,产生野指针,甚至有可能导致程序崩溃。(3)写了释放资源的语句,但却从之前r...

2019-04-04 18:27:22 443

原创 C++对象的声明周期及程序优化!

Test GetTestObject(Test &t){ int value = t.getData(); return Test(value);}C++中函数的调用过程内部往往会调用很多函数,比如定义对象会默认调用构造函数和析构函数;如果定义对象的同时用另外一个对象来初始化它会调用拷贝构造函数;如果先定义一个对象,然后再用已有的对象来初始化该对象会调用赋值构造函数。所以,...

2019-04-01 18:05:34 311

原创 C++中string类的实现!

在实现自己的string类之前,我们先来了解一下标准库的string类型。string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作。标准库string类型的目的就是满足对字符串的一般应用。要使用string类型的对象,必须加上头文件:#include<string>#include<iostream>#includ...

2019-03-21 17:19:02 357

空空如也

空空如也

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

TA关注的人

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