自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(125)
  • 问答 (5)
  • 收藏
  • 关注

原创 【牛客】连续子数组的总和

题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至

2017-08-31 12:18:18 539

原创 【牛客】最小的k个数

使用topK的方法,如果不想写堆的话,了解几个库里的堆的函数std::make_heap将[start, end)范围进行堆排序,默认使用less, 即最大元素放在第一个。 std::pop_heap将front(即第一个最大元素)移动到end的前部,同时将剩下的元素重新构造成(堆排序)一个新的heap。 std::push_heap对刚插入的(尾部)元素做堆排序。 std::sort_hea

2017-08-30 18:20:06 461

原创 重新调整数组的顺序是奇数位于偶数的前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变思路: 从前向后遍历,先找出第一个偶数; 然后以这个偶数为基准,向后找出奇数,插入到这个偶数的前面class Solution {public: void reOrderArray(vector<int> &array

2017-08-30 13:02:11 426

原创 【牛客】顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16思路: 1、求出行和列

2017-08-30 12:59:25 350

原创 【牛客】二叉搜索树与双向链表

题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路: 1、树为空,直接返回 2、树只有一个节点,将其根节点返回 3、定义一个指针pre指向访问过的节点,然后使用递归的思想实现 4.递归左子树,找到最左边节点 5.将当前节点的左指针指向pre,如果pre不为空,将pre的右指针指向当前节点 6.递归右子树

2017-08-26 23:06:15 295

转载 Linux软链接和硬链接

硬链接与软链接是 Linux 文件系统中的一个重要概念,其涉及文件系统中的索引节点 (index node 又称 inode),而索引节点对象是 Linux 虚拟文件系统 (VFS) 的四个基本概念之一所以,再说软硬链接之前我们先从inode入手来了解下文件系统文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件

2017-08-22 22:51:22 431

原创 C语言实现C++继承和多态

例:C++中的一个类“Person”//Person.hclass Person{private: char* pFirstName; char* pLastName;public: Person(const char* pFirstName, const char* pLastName); //constructor ~Person(); //de

2017-08-01 22:08:14 315

原创 TCP三次握手和四次挥手

建立TCP需要三次握手,断开TCP需要四次挥手,那么这是为什么呢?下面我们来一一解释为什么要三次握手 首先我们先来了解一下三次握手是怎样建立的:首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了在数据传输过程中,可能会发生丢包的情况,这可能在1、2、3的

2017-07-26 22:31:45 257

原创 端口号调研、URG和PSH、及TCP的计时器

端口号端口号是用来标识目的主机当中的唯一网络进程,因此IP地址+端口号=》套接字;套接字可以确定唯一的一个进程。Tcp/Ip协议中引入一种叫做“套接字”的应用程序软件,有了这样一种技术,一台电脑就可以与任意一台具有套接字的电脑通信。端口的分类:从性质来分: 1)公认端口:0—1024,紧密绑定一些特定的服务,这类端口不可重新定义它的作用对象,例如80号端口对应http,23号端口对应Telnet服

2017-07-23 23:26:13 473

原创 NAT技术与代理服务器原理

NAT技术定义:NAT网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。NAT原理 NAT网络地址转换(

2017-07-20 12:50:50 409

原创 crond和crontab调研

crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。而crond是crontab的守护进程。1、定时任务的种类 at    适合仅执行一次就结束的调度命令,需要启动一个后端的atd服务。 crontab 需要启动一个服务crond才行,crond服务通过cr

2017-07-20 11:23:51 281

原创 线程安全和可重入函数

一、线程安全什么是线程安全呢?线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。那么,相反的,线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。例如:如果你的代码所在的进程中有多个线程同时运行代码,而且运行的结果和单线程的运行结果是一样的,

2017-07-14 22:18:55 267

原创 哈希表

数据结构我们了解好几个了,其中写的最多的就是顺序表和链表,在这个阶段,还模拟实现了库中的vector和list,随后我们又了解了队列和栈这些都是线性的数据结构,所以想要查找一个元素的话,这些的时间复杂度都是O(N)。除了线性结构还有树形结构,在这里我们从二叉树开始,先后了解了二叉树的实现以及线索化,不过我们发现一个问题,那就是如果二叉树写成单支的情况,那就是线性结构了,所以我们又了解了平衡二叉树、红

2017-07-03 08:16:48 286

原创 线程同步与互斥及死锁问题

线程我们之前已经总结过了,就是进程的一个执行分支。既然是一个执行分支,那么我们就可以定义两个线程,在定义一个全局变量,初始值置为0,让这两个线程,同时对这个全局变量进行++处理,1000次,100000次,100000000次,之后,你会发现,数值越大,你得到想要的结果的几率就越小。这是为什么呢?这个全局变量可以被这两个线程同时看见,那么他就是临界资源了,但是线程对临界资源访问,却不原子性的,那么出

2017-06-12 12:32:06 789

原创 线程

线程:是进程的执行分支。线程是子进程内部运行的,这里的内部说的是,初始进程创建的地址空间。但是Linux下并没有真正意义上的线程,只有进程模拟的线程,因为Linux并没有给线程一个专门的结构体,而且,CPU也不需要区分进程和县城,他只需执行就行了。所以,线程又叫轻量级进程。线程的特点:在多线程OS中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。线程具有

2017-06-10 23:19:49 281

原创 进程间通信——共享内存

我们都知道,每一个进程在物理内存中都对应一块单独的地址空间,但是今天我们来看一个不一样的东西——共享内存那么什么是共享内存呢?共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。今天我们就来创建共享内存,不过看这些之前,我们先来了解几个函数://创建共享内存int shmget(key_t key, size_t size, int

2017-06-10 21:13:52 287

原创 进程间通信——信号量

在说信号量之前我们再来复习一下几个概念:1、把两个或多个执行流所能访问的同一块内存资源叫做临界资源2、把访问临界资源的代码叫做临界区3、在任意时刻只有一个执行流可以访问临界区,这种现象叫做互斥4、一件事,要么做了,要么没有做,这叫做原子性现在我们来看下什么事信号量信号量:信号量的本质是一种数据操作锁(计数器)、用来负责数据操作过程中的互斥、同步等功能。 那么为什么要使用信号量呢?使用信号量为了防止多

2017-06-10 20:09:42 256

原创 进程间通信——消息队列

上一次我们看的管道是单向通信,如果你想用管道进行双向通信,可以创建两个管道。下面我们再来看一个可以双向通信的——消息队列(msgqueue)消息队列提供了一种从一个进程向另一个进程发送一个有类型数据块的方法。创建消息队列用的函数是:int msgget(key_t key, int msgflg);其中,key(消息队列标识符)可以看成端口号,管道用的是文件描述符来判断确定父子进程使用的是同一个管道

2017-06-10 19:47:02 360

原创 B树的实现

二叉搜索树我们已经了解了很多种形式了,有AVLTree、红黑树等,不过,这都是在二叉搜索树的基础上加了些东西(平衡因子、颜色),其本质还是二叉搜索树。现在我们遇到一个问题:要是要查找的数据量很大的时候,还用这个,那么树的深度将会很深,那么要怎么解决呢?要保证数据量不变的情况下,将树的深度降低。这就是B树了,今天我们就来了解一下B树的原理,以及实现过程。B-树的定义(数据结构书上就是这么写的,不要读作

2017-06-10 15:24:45 415

原创 进程间通信——管道

我们都知道,进程的运行具有独立性,那么如果想让进程之间通信,该如何实现呢?今天我们就来看几种进程间通信(IPC)。说到进程间的通信,它的本质就让不同的进程看到同一块资源,这也是进程间通信的前提。一、管道进程间通信最基本的机制:管道–>由pipe创建#include <unistd.h>int pipe(int filedes[2]);调用pipe函数时在内核中开辟一块缓冲区(管道)用于通信其中参数

2017-06-09 16:32:16 305

原创 红黑树的实现 以及加迭代器

在说红黑树之前,我们先来认识一下它:首先强调一点:红黑树也是二叉搜索树。那么它就满足二叉搜索树的性质,除此之外,他还有几个比较特殊的性质,了解这些,有助于我们后面的分析性质:1、红黑树所有的节点都有颜色(红或黑)2、红黑树的根结点是黑色的3、红黑树的两个红色节点不能相连4、红黑树的每一条链的黑节点的个数相同5、所有空的节点都是黑色的知道了这些之后开始进入红黑树的创建:显然这就是红黑树的插入操作的编写

2017-06-03 19:20:54 1324 1

原创 AVL树(旋转问题详解)

二叉搜索树给我们了一个搜索一个点的方法,同时,也将二叉树中的节点排序了,但是,对于一些特殊的二叉树来说,使用二叉搜索树会很费空间,比如说:左单支的这种情况,你说是二叉树,还不如说是单链表呢,还节省了一大波的空间呢(右指针域),同样的,对于右单支的情况也是如此,那么现在我们就要想能不能避免这个问题。可以,一个平衡因子就可以搞定,加了平衡因子,那么这颗二叉搜索树就是AVLTree了那么现在我们就来分析一

2017-05-26 16:14:39 1686

原创 二叉搜索树(二叉排序树)

二叉搜索树:又称二叉排序树,他有三个特点:1、若它的左子树不为空,那么它的左子树中所有节点的值都小于根结点的值2、若它的右子树不为空,那么它的右子树的所有节点的值都大于根结点的值3、它的左右子树也是二叉搜索树那么现在我们就来给出一个二叉搜索树,我们来观察一下,看看能发现什么。 首先我们可以根据他的性质可以分析出,最左边的结点是最小的,而最右边的结点是最大的,这样就给出了一个球最小结点和最大结点的方

2017-05-21 23:47:58 914

原创 求一个二叉树中两个结点的最大距离

首先说一下距离这个词,在二叉树中距离就是从一个节点到另一个结点的边的条数,为了更为清晰的描述这个概念,下面来看一张图:看上面的图,蓝色线表示的是结点4到6的距离,红色线表示的是从结点5到6的距离,从图中我们可以看到,不是所有的距离都经过根结点的,这一点很重要。那么怎么求最远距离呢?上面的那个图中,我们可以很容易看出最远的距离就是从4到6,或者是从4到5,都是一样的。而且我们还发现,他们分别是左子树的

2017-05-19 17:30:14 3020

原创 关于二叉树的一些题

二叉树的创建我们已经了解了,现在我们在这一个基础上来拓展一些常出现的题1、在二叉树中寻找一个节点——>存在,返回节点,不存在返回NULL2、求一个节点的双亲节点——>存在,返回节点,不存在返回NULL3、求二叉树的高度4、求叶子节点的个数5、求第K层的节点个数6、求一个二叉树的镜像……不过在这这钱我们先来补充一下二叉树的性质:1、若规定根节点的层次为0,南无一个非空的二叉树的第i个节点最多有2^i(

2017-05-16 20:32:40 1362

原创 文件描述符(fd)与FILE结构体

文件描述符内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。我们知道,在Linux中有一个说法:一切皆文件,而文件描述符又是内核访问文件的桥梁,可以想象文件描述符的中药材程度。既然文件描述符是一个非负整数,那么到底是几呢?又有什么规律可循呢?首先我们

2017-05-14 15:31:54 857 1

原创 二叉树的创建和遍历

先序:根结点——>左子树——>右子树(递归、非递归)中序:左子树——>根结点——>右子树(递归、非递归)后序:左子树——>右子树——>根结点(递归、非递归)层序:从根结点开始,按照从上到下,从左到右的顺序

2017-05-09 23:11:10 882

原创 稀疏矩阵的压缩存储和快速逆置

稀疏矩阵啊,就是矩阵中的有效元素很稀疏,稀疏到什么程度呢?通常认为矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于0.05时,则称该矩阵为稀疏矩阵(sparse matrix)。我们想,一少部分的有效元素就占用大部分的地址空间,是不是很浪费,那么我们就要想办法让其不浪费那么多,就是压缩存储。之前我们写过对称矩阵的压缩,那是因为对称矩阵的分布很有规律,但是再看一眼稀疏矩阵,除了有效元素少一点,也没

2017-05-07 23:48:59 731

原创 对称矩阵的压缩存储

矩阵对于学数学的都不陌生,说白了就是一个二维数组嘛,不过矩阵里有一些很有特色的矩阵,今天我们就来看一种——对称矩阵。下面来看一个对称矩阵,顺便分析一下,对称矩阵的性质,以便我们随后的研究。我们看,中间红线标出的就是对称线,既然是对称,那么首先这个矩阵得是方阵,也就是说,行数和列数相等;整个矩阵分为两部分,上三角和下三角,在上三角行号小于列号,而在下三角行号大于列号;最后就是对称表现出来的性质了:a[

2017-05-05 17:23:51 1522

原创 中缀表达式转化为后缀表达式、后缀表达式求解(栈)

计算器我们都实现了很多了,但是,我们写的计算器都是求解两个操作数的,并不能求解一个表达式,如今栈已经学完了,那么我们可不可以使用栈来实现表达式的求解呢?我们数学上求解一个表达式是如何进行的,有括号的先求括号内部的,之后先算乘除,再算加减。现在如果来实现一个这样可以求解表达式的计算器,怎样进行呢?首先是将中缀表达式转化为后缀表达式,具体的规则如下:1、遇到操作数,直接输出; 2、栈为空时,遇到运算

2017-05-02 17:48:40 512

原创 模拟实现~僵尸进程和孤儿进程

僵尸进程首先说一下,什么是僵尸进程呢?当进程退出并且父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。那么接下来我们就来模拟实现一个僵尸进程吧:下面看一下运行结果:僵尸进程是一种特殊的进程,这种进程光听名字就知道很可怕,那么我们就来看看它的可怕之处吧。我们知道僵尸进程的产生是因为进程退出时父

2017-04-27 16:40:51 1157 1

原创 迷宫

迷宫程序

2017-04-25 19:46:45 294

原创 C++ 大总结

继C语言之后,C++也告一个段落了,不过,只是总要串起来才能更有效的掌握,那么现在就来再回顾一下C++的内容,并且将其串起来。在学习C++之前,我们就用C语言实现了顺序表和链表,这是学习数据结构的基础,提前接触总是好的,在学习c++之后,我们又实现了了两次,分别是使用类实现、使用模板类实现。那么接下来我们就进入C++的第一个主题——类类说到类,我就不得不提结构体,当然不是C语言中的结构体,而是C++

2017-04-25 18:52:47 517

原创 模拟实现 stack和queue

线性表是最基本、最简单、也是最常用的一种数据结构。之前我已经写了几次线性表了,分别是顺序表和链表,这两个以各种形式实现了多次,那么今天我么就再来看两种线性表,两种特殊的线性表——栈和队列栈(stack)首先说一下栈的概念:栈又叫后进先出的线性表(LIFO),不明白?那就再看一下它的结构吧,栈是只在一端进行插入和删除操作的,这也是它的特殊之处,这一段就是栈顶(top)。既然栈是线性表,那么肯定有顺序栈

2017-04-20 22:56:25 1083

原创 模拟实现 list

链表前面我已经写过了,不过写的是单链表,而C++库中的list是双链表,那么,我们就来模拟实现一下双链表,这样对于库中的list也会有更加深刻的了解。那么首先我们先来了解一下双链表的结构,双链表无非就是比单链表多了一条链,单链表只有一条指向下一个节点的链,而双链表会多一条指向前一个节点的链。说白了就是多了一个指针罢了。而具体的函数功能还是那些,那么我们就来实现这个链表吧!#include<iostr

2017-04-15 23:31:29 409

原创 Linux进程描述符:task_struct结构体

进程是什么?如果有人问你,进程是什么,你该如何回答呢?正在执行的程序;程序的执行实例;能分配处理器并由处理器执行的实体。进程是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源。那么进程和程序的区别是什么呢?1、进程在内存上,程序在硬盘上 2、进程比程序多了很

2017-04-14 22:50:13 792

原创 shared_ptr:定制删除器 和 循环引用

前面我们介绍智能指针的时候,说了两个智能指针分别是:auto_ptr和scoped_ptr,auto_ptr有问题,为此,scoped_ptr的出现解决了这个问题,scoped_ptr太霸道,不允许别人和他共用一块内存空间,所以,我们还得想办法解决这个问题。回想我们以前看过内容,当提到共用一块内存空间的时候,我们会想到什么?当然是深拷贝和浅拷贝了,最后我们是不是有给出了一个写时拷贝,就是通过引用计数

2017-04-13 21:26:08 931

原创 智能指针:auto_ptr 和 scoped_ptr

很多人都说:C++比Java难,难就难在指针,指针很难学,但是不可否认,通过指针,我们确实将很多问题解决了,不过为什么要引入指那个指针呢?首先这里先声明一点:智能指针并不是指针,它的本质是个类,不过,它的功能是自动管理指针所指向的动态内存和释放工作,所以叫他智能指针。那么为什么要引入智能指针呢?先来看一个例子:int FunTest(){ int *p = new int; if

2017-04-08 20:02:38 1959 1

原创 Linux下的小程序:进度条

当我们再上传或者下载什么东西的时候,通常会显示一个界面,这个界面显示的是你加载的多少,那么在Linux下有没有进度条呢?今天就来实现一下吧!首先应该出现的就是一个进度,另外还有一个是百分比。百分比还好说,关键是进度,这是一个逐渐增加的形式,而且还是一直显示一个界面。逐渐增加还好说一点,我们只需要写一个循环就可以了,关键是一直显示的是最新的显示信息,这个就用到我们以前学的一个函数了,fflush(),

2017-04-05 20:05:33 523

原创 gdb安装、vim配置

gdb的安装:昨天使用vim的时候遇到了一些问题,分享一下:首先说一下我使用gdb调试的时候出现的问题吧!在使用vim写程序的时候避免不了的就是调试,在Linux下,调试使用的是gdb。不过,当我输入命令的时候,出现了报错,就是gdb这个命令不存在,多试了几次发现,命令写的没错,那么重点来了。我发现,我没有安装gdb,这就尴尬了,然后就是百度了,发现这条命令会让你自动安装,不过前提是你的虚拟机得连上

2017-04-04 17:28:29 851

空空如也

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

TA关注的人

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