自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 go语言基本特性

go语言,基本特性

2018-11-16 09:52:04 231

原创 测试开发面试题

第一次面试还是蛮激动的,就把自己在面试中的问题总结下吧,为后面做准备吧1:内存管理(常见的内存错误,野指针,栈溢出,以及如何解决吧)个人回答C语言中三个开辟内存的函数,malloc,calloc,realloc区别以及特点,然后说C++的内存管理是如何以及出现内存的错误如何处理,迁移到智能指针来管理,四种智能指针的简单介绍2:数据结构map和set的区别? 答:底层红黑树,前者是key-val操作

2017-09-12 21:42:30 1317

原创 5种I/O模型

一:概念的理解: 首先在网络编程的时候,我们常常见到同步/异步,阻塞/非阻塞四中调用方式:1同步和异步主要针对C(client)端 同步: 所谓的同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用步返回,也就是说必须一件一件事做,等前一件事完了之后才做后一件事。 如:普通的B/S模式(同步):提交请求->等待服务器处理->处理完毕返回,这期间客户端浏览器不能干任何事异步: 与同

2017-09-05 13:57:13 4844

原创 查找最小的K个数

输出最小的K个数 方案1:如果输入的数组可变,我们可以借助Partion部分排序的思想,随机选k值,经过排序后,k左边的数都比k小,k右边的数都比k大,这样经过排序后,在k左边的数字就是最小的K个数:int Partion(int*a, int n, int left, int right){ if (a == NULL || n <= 0) { return 0

2017-08-27 10:21:11 536

原创 查找数组中出现次数超过数组长度一半的数字

题目: 数组中一个数字出现的次数超过数组长度一半的次数,请找出这个数字,例如输入一个长度为9的数组{1,2,3,2,2,25,4,2},由于2出现的次数实际5次,超过数组的一半,因此输出的结果是2.思路:开始的时候想到用map,依次遍历这个数组,map会对这些数字排序,这种方法和Topk的问题很像,比较容易实现.但是时间复杂度是N(lgN),如果我们要求时间复杂度是O(N)呢?方案一:借助快排的部

2017-08-13 08:30:03 523

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

一:TCP的特点: 1:面向连解的 2:面向字节流 3:保证可靠传输(丢包重发,超时重传) 4:支持全双工通信 5:支持端口到端口的连接,每一条TCP连接只能有两个端点 二:TCP协议可靠性的是是三个问题? 一:可靠传输a:确认和重传:接受方收到报文就会确认,发送方发送一段时间后没有收到确认就会重传 b:数据校验 c:数据合理分片和排序 UDP:IP数据报大于1500字节(MTU

2017-08-08 23:35:52 412

原创 HTTP协议--基础篇

一:基础知识: HTTP协议是应用层协议,在前面我们知道TCP/IP四层模型中,下三层主要负责数据的传输处理,但是没有涉及到解析,关于解析主要有应用层来处理,而HTTP协议就是一个属于应用层的面向对象的协议,由于其间接,快速的方式,适用于分布式超媒体信息系统. HTTP:协议的主要特点: 1:支持客户/服务器模式 2:简单快速:客户面向服务器请求服务时,只需传送请求方法和路径.请求方法常用的

2017-08-05 09:54:00 964

原创 Shell脚本语法篇

一:条件测试 1:条件测试:命令test或者是 [ 但是 [ 通常与 ] 一起是使用 我们再来看看结果: 要分析这种现象必须的明确几个概念,在Shell中,一切都是指令,而test和[是起到条件判断的作用,在C语言中我们会根据返回值来判断条件语句是否成立,在Shell中我们是根据退出来判断条件语句的成立与否,这点和进程和线程十分相像,通常我们规定正常退出退出码为0(条件为真),否则(条

2017-08-03 20:58:33 593

原创 Shell脚本符号篇

一:shell运行原理: 前面#! 表示shebang 第一种: shell脚本中#表示注释,这个和C语言的//类似,但是在#位于第一行开头,并且是个例外,它表示该脚本 使用后面指定是解释器/bin/bash解释执行 我们知道shell是命令行解释器,那么它又是如何运行程序的呢? shell会fork一个子进程并调用exec执行./1.sh这个程序,exec系统调用应该吧子进程的代码

2017-08-02 12:17:58 613

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

一:概念: 设计模式就是一套被反复调用,经过分类,代码设计总结的经验: 单例模式: 也叫单间模式:Singletion是一种常用的设计模式,在大型的项目中都会使用,因为构建一个线程安全并且高效的单例模式很重要. 实现单例模式需要满足两个条件: 1:单例类保证全局只有唯一的实例对象 2:单例类提供获取这个唯一实例的接口 二:一个简单的单例 //实现一个简单的单例**class Sing

2017-07-31 20:15:09 647

原创 C语言如何模拟C++实现继承和多态

首先要明白c++的三大特性:封装,继承,多态 而这些C语言统统都没有,那么C语言如何实现继承和多态呢? C++的继承属性是通过访问限定符:public,protected,private来实现. 我们知道c++的多态必须满足两个条件:虚函数的重写已经父类的指着和引用指向子类的对象. 思路:我们知道在C语言中没有类的概念,但是却有结构体struct,默认C++中struct也是类,这样我们就可

2017-07-29 23:34:49 1751

原创 求两个单链表的差集和并集

题目:- 已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。 思路:指针的指针pa遍历链表A,指针pb遍历链表B,当节点的值相等,删除,提前将删除位置的下一个节点保存,然后 继续遍历

2017-07-27 12:07:02 12863

原创 判断一个栈的弹出序列是否为合法序列

题目: 输出两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序,假设压入栈的苏偶偶数字均不相等.例如序列1,2,3,4,5是某栈的压栈序列.序列4,5,3,2,1是该压栈序列的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 思路: 验证:#include<iostream>#include<stack>#include<assert.h>

2017-07-25 14:43:38 1519

原创 判断一颗树是不是完全二叉树

首先我们要明白完全二叉树的含义: 完全二叉树: 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左 边,这就是完全二叉树 我们先来回顾下二叉树按层遍历,先将根节点进队列,然后判断每次这个队列是否为空,不为空,每次取队头的数据然后pop,最后再递归走其子问题,判断左子树是否为空,不为空直接入队,再判断右子树是否为空

2017-07-25 10:52:54 663 1

原创 刷题--二叉树的镜像

题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像 那么什么是二叉树的镜像呢?我们其实可以从生活中得到启示,每个人早上起来都有找镜子的习惯,这样我们就会很容易想明白二叉树的镜像了, 如图两颗互为镜像的二叉树. 观察这颗二叉树我们会发现,这两颗二叉树的根节点相同,但是它们的左右两个子节点交换了位置. 步骤: 1:首先交换节点2和节点6 2:第二步:交换将节点1和节点3作为整体然后

2017-07-24 21:59:26 250

原创 socket--多进程,多线程服务器

一:概念: 我们知道IP地址是标志网络中不用主机的IP地址,而端口号就是同一台主机上标志不同进程的地址,IP地址和端口号标志网络中的唯一地址.(又称socket) 在TCP协议中,建⽴立连接的两个进程各⾃自有⼀一个socket来标识,那么这两个组成 的socket就唯⼀一标识⼀一个连接。socket本⾝身有“插座”的意思,因此⽤用来描述网络连接的一一 对应关系. 二:通信中的大端小端的问题如何

2017-07-24 10:46:43 2303 1

原创 gdb调试多线程

一:调试 我们知道在Windows下我们常用 F5调到断点处 ,F9设置断点或者取消断点,F 10开始调试或单步执行 F11进入函数内部 F7编译 Ctrl+F10调到函数内部 当然有时我们也会使用调试窗口或者查看栈帧来进行调试. Linux下调试我们通常使用gdb(代码调试工具) 注意在写Makefile文件时,要加上-g 1:开始调试gdb filename 2:l 1其

2017-07-20 20:40:54 782

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

方法一:在一个一维数组里面查询: 最直接的方法是从头到尾遍历这个字符数组的字符,当访问这个字符时,拿这个字符和后面的每个字符匹配,如果下次又找到一个字符再次出现,就表明是出现两次的字符,如果字符与n个字符,每个字符可能都会与后面的比较,这种思路的时间复杂度较高,O(N^2) 方法二:map加上排序; 思路是:将字符作为,键值,将出现的次数作为实值,那么如歌保证第一个出现的次数是两次我们需要加

2017-07-20 16:55:26 697

原创 一个fork的面试题

题目: 请问下面的程序一共输出多少个”-“#include<stdio.h>#inlcude<unistd.h>int main(){ int i; for(i =0;i<2;i++) { fork(); printf("-"); }return 0;}可能开始的时候大家都以为会输出6个”-“,但是结果输出了8个”-“. 要弄明白这个题,还是先从fork()调用开始

2017-07-17 20:07:03 409

原创 判断链表是否带环?若带环求环的长度?求环的入口点?

一:判断链表是否带环 方法是快慢指针: 开始的时候,两个指针都指向开头,然后让快指针走两步,而慢指针每次走一步,当他们在某个点相遇则表明,这个链表带环,否则继续遍历这个链表bool IsCircle(ListNode*phead){ assert(phead); ListNode*fast =phead; ListNode*slow =phead; while(

2017-07-17 11:22:22 449

原创 再识智能指针

背景 为什么需要智能指针: 如果在程序中 这时我们希望有一个类来帮我们完成资源的管理,智能指针就出现了. 什么是智能指针? 分三步去理解 a:第一步:RTLL: 又称资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. 简单点说就是在初始化时获取系统的资源,在析构时,释放资源.b:第二步:

2017-07-16 10:10:26 2108 7

原创 反转链表和查找倒数第K个节点

一:链表的逆置(反转链表) 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的头结点: 节点的结构struct ListNode{ ListNode(const int& val) :_val(val) ,next(NULL) {} int _val; ListNode*next;};这里面我们需要三个指针分别是cur,用来顺序遍

2017-07-14 16:23:19 656

原创 如何定义一个只在栈/堆上生成的对象

一:首先复习下内存结构; 1:栈(stack):–由编译器自动分配释放,存放函数参数值,局部变量值等. 2:堆(heap):一般是由程序员分配释放,若程序不释放,程序结束时可能由操作系统回收 3:全局区(静态区):主要存放全局变量和静态变量,分为已初始化的全局变量和静态变量区,data区,未初始化的全局变量和静态变量区(bbs区); 4:常量区:各种常量字符 5:代码段:存放函数二进制代码

2017-07-13 16:57:41 1810

原创 TCP的四种定时器

在TCP协议中有的时候需要定期或者按照某个算法对某个事件进行触发,那么这个时候,TCP协议是使用定时器进行实现的。在TCP中,会有四种定时器: (1)重传定时器 (2)坚持定时器 (3)保活定时器 (4) 时间等待计时器 这四个定时器都有各自的具体作用。 一:重传定时器 重传定时器:为了控制丢失的报文段或丢弃的报文段,也就是对报文段确认的等待时间。当TCP发送报文段时,就创建这个特定报

2017-07-13 09:07:16 431

原创 TCP报文段中的URG和PSH

一:TCP报文段的首部格式 首先明白TCP虽然是面向字节流的,但TCP传输的数据单元确实报文段,一个TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它首部中的个字段的作用,因此只有弄清楚TCP首部个字段的作用才能掌握TCP的工作原理. TCP报文段首部的前20个字节是固定的,后面有4n字节是根据需要而增加的选项,,因此TCP首部的最小长度是20字节 二:首部固定部分各字段的意义:(

2017-07-12 10:42:48 1466

原创 端口与服务

一:概念 在网络技术中,端口包括逻辑端口和物理端口两种类型, 物理端口是指物理存在的端口如:集线器,交换机,路由器上用于连接其他网络设备的接口. 逻辑端口:是指逻辑意义上用于区分服务的端口,如TCP/IP协议中的服务端口, 端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等。由于物理端口和逻辑端口数量较多,为了对端口进行区分,将每个端口进行了编号,这就是端

2017-07-11 22:34:12 4369

原创 路由表的生成算法

一:几个概念 1:路由器: 是连接因特网中的个局域网,广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号.路由器又称网关设备是用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网,当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成.因此,路由器具有潘丹网络地址和选择IP路径的功能,它能在多个网络互联的环境中,简历灵活的连接,可用

2017-07-11 11:32:28 1478

原创 NAT技术及其应用

一:概念: 共有IP:也叫全局地址,是指合法IP地址,它是由NIT(网络信息中心)或者ISP(网络服务提供商)分配的地址,对外代表一个或多个内部局部地址,是全球统一的可寻址的地址. 私有IP地址:也就内部地址,属于非注册地址,专门为组织机构内部使用,因特网分配编写委员会,保留了3块IP地址做为私有IP地址: 10.0.0—-10.255.255.255 172.16.0.0—172.16.2

2017-07-10 22:52:09 1267

原创 浅谈ARP

一:ARP的原理: 我们知道以太网设备比如网卡都有自己全球唯一的MAC地址,它们是以MAC地址阿里传输以太网数据包的,但是它们却识别不了IP包中的IP地址,所以我们在以太网中进行IP通信的时候就需要一个协议来建立IP地址与MAC地址的对应关系,以使数据包能发到一个确定的地方去,这就是ARP(地址解析协议)1:ARP数据报格式 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知

2017-07-10 11:46:26 665

原创 CRC校验

一:什么是CRC? CRC即循环冗余校验码:是数据通信领域中最常用的一种差错校验码,器特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将结果附在帧的后面,接受设备也执行类似的算法,以保证数据传输的正确性和完整性.二:常见的校验方法:1:奇偶校验 设置奇偶校验位,所谓的奇偶校验就是在发送的每一个字节后加上一位,是的每个字节中的1的个

2017-07-09 16:27:43 936

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

信号量的本质 是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标志,信号量在此过程中负责数据操作的互斥,同步等功能. 一:为什么要使用信号量 为了防止因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任意一时刻只能有一个执行线程访问代码的临界区域.临界区域是指

2017-07-09 16:21:02 445

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

一:什么是消息队列? 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.每个数据块都被认为是一种类型,接受者进程接收的数据块可以有不同的类型值.我们可以通过发送消息来避免命名管道的同步与阻塞问题.消息队列与管道不同的是,消息队列是基于消息的,而管道是基于字节流的.且消息队列的读取不一定是先入先出. 缺陷是:每个消息的最大长度是有限的(MSGMAX),每个消息 队列的总的字节数是有上限

2017-07-08 09:33:41 962

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

一:什么是线程安全? 就是所如果代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码,如果每次运行的结果是一样的,而且其他变量的值和预期的是一样的,就是线程安全的.或者说一个程序锁提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口执行结果的二义性,也就是我们不用考虑二义性.下面这几个条件可以判断线程是不安全的: 1:函数中访问全局变量和堆 2:函数中分配,重

2017-07-06 16:27:10 662

原创 信号阻塞

一:关于信号的几种状态 1:信号递达:实际执行信号的处理动作称为信号递达 2:信号未决:,从产生到递达之间的状态称为未决状态.进程可以选择阻塞某个信号,被阻塞的信号产生时将保持未决状态,直到进程解除对次信号的阻塞,才执行递达的动作. 注意,阻塞和忽略是不同的,只要信号被阻塞就不会被递达,而忽略是在递达之后可选的一种处理动作. 我们可以画图来表示信号在内核中的表示 每个信号都有两个标志位分别

2017-07-06 10:31:47 555

原创 网络基础知识

一:协议: 日常生活中我们经常我听到各种各样的口头上的协议,比如拔河比赛,大家一起按照首先约定好的口号,123一起发力等等这样的栗子不胜枚举,我们把双方之间的约定就叫做协议,当前在网络当中也有各种各样的协议.为了更好的理解他们我们先从网络的分层开始. 二:到底是7层还是4层? 目前我们所熟知的有OSI(开放系统互联)七层模型,还有就是非常有名的TCP/IP协议. 为什么要分层呢? 分层的目

2017-07-03 14:31:45 594

原创 守护进程

一:线路规程 先给一个简单的栗子: 我们在终端下按下字母aaaaaa在bash下会显示aaaaa,但当我们按下组合键Ctrl-C,为什么却没有显示Ctrl-C呢? 这就是线路规程干的好事,那么什么是线路规程,简单点说就是就是内核层面的过滤器. 键盘输入的数据被驱动程序提交给线路规程,当输入的普通字符,线路规程不会做任何处理,默认让它通过,而当输入的是组合键时被解释成信号.这就很容易解

2017-07-02 12:16:10 691

原创 信号

一:信号: 日常生活中,我们会遇到很多信号,比如放学回家看到红灯(信号),我们的”反应”是停下来.早上当闹铃响的时候我们大多数情况是选择”关了”继续睡,或者选择”无视”.总是生活中有者各种各样的形形色色的”信号”. 简单的说所谓的信号是看到(识别),并且做出反应的行为称为信号.当然我们也可以通过指令查看信号 kill-l可以查看所有进程 二:产生信号的条件: 1:用户在终端按下按下某些键时

2017-07-01 14:33:06 951

原创 作业,进程组,终端

1:进程组: 每一个进程除了有一个进程ID,还属于进程组.进程组是一个或者多个进程的集合.通常,它们与同一作业相关联,可以接收来自同一终端的各种信号.每个进程组有一个唯一的进程组ID,每个进程组都可以有一个组长进程.组长进程的标志是,其进程组ID等于其进程ID. 组长进程可以创建一个进程组,创建该组中的进程,然后终止.只要在某个进程组中一个进程存在,则该进程组就存在,这与组长进程是否终止无关.函

2017-07-01 10:23:25 318 1

原创 生产者和消费者模型

一:条件变量: 我们知道多线程访问时会出现冲突的问题,为了解决这个问题我们引入互斥锁的概念,即多个线程同时访问理解资源时,获得锁多线程可以完成”读-修改-写”操作,然后释放锁给其他线程.没有获得锁的线程只能挂起等待. 与互斥锁不同,条件变量时挂起等待而不是上锁,条件变量用来自动阻塞一个线程,直到某特殊情况的发生,通常条件变量和互斥锁同时使用. 原理:条件变量是利用线程间共享的全局变量进行同步的

2017-06-24 17:01:53 402

原创 哈夫曼树

huffman树,又称最优二叉树,是加权路径长度最短的二叉树 [贪心算法]是指在问题求解时,总是做出当前看起来最好的选择,通俗的说贪心算法不是整体最优的选择,而是局部最优解 使用贪心算法构建Huffman树 构建哈夫曼树主要包括两部分: 1:建小堆 2:将加权路径长度最短,构建最短二叉树 一:建小堆:#pragma once#include<vector>#include<ass

2017-06-14 17:33:52 542

空空如也

空空如也

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

TA关注的人

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