自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 资源 (1)
  • 收藏
  • 关注

原创 代理模式

媒婆这个职业大多人可能都知道,媒婆是干什么的呢?当你找MM时,你需要向多个MM发送同样的问题,你多高,你喜欢什么,但是你可能很忙没有时间怎么办呢?那就找个媒婆替你自己去问。#include#includeusing namespace std;class Girl//追求的对象{private: string name;public: Girl(string _name

2017-08-30 14:51:11 214

原创 工厂模式

接着上文简单工厂模式的问题,简单工厂模式的最大优点是工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。比如你想产生加操作,直接把加号给工厂,工厂就产生了加类的产品。但是如果要添加新功能,比如求M数的N次方,就需要增加case分支,因此就违背了开放-封闭原则。什么叫开放封闭原则呢?开放:也就是该模块的行为是能够被扩展的,当应用程序的需求

2017-08-30 11:21:35 183

原创 简单工厂模式

问题:现在实现一个计算器功能,输入两个数和操作符,求两个数操作之后的结果。于是可以有这样一份代码:switch (ch) { case '+': ... }改进:使用面向对象的思想,让操作和实现分离,从而使得程序更加灵活,容易修改,并且易于复用。设计出这样的一个类:class operation{public: int getresult(int a, int

2017-08-30 10:47:12 224

原创 抽象工厂模式

问题来源:假设有这样一款游戏,游戏有等级,分别为初级,中级,高级甚至有BT级。假设也是过关的游戏,每个关卡都有一些怪物(monster)守着,玩家要把这些怪物干掉才可以过关。作为开发者,我们就不得不创建怪物的类,然后初级怪物、中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同)。在每个关卡,我们都要创建怪物的实例,例如初级就创建初级怪物(有很多种类)、中级创建中级怪物等。可以想象

2017-08-29 21:27:33 269

原创 策略模式

策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,但是不会影响到使用算法的客户。策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合,策略模式依赖于多态。设计步骤:1. 策略的抽象类(纯虚基类),起到接口的作用,抽象类的指针可以访问所有子对象。2. 实现

2017-08-29 20:03:50 203

原创 备忘录模式

备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储Originator的哪些内部

2017-08-29 17:50:39 181

原创 中序表达式转后缀表达式

中缀表达式X=A+B*(C-(D+F))/E转后缀表达式之后是什么?ABCDF+-*E/+ABDF+C-*E/+ABDF+C*-E/+ABDF+C*-E+/中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左

2017-08-26 23:03:50 444

原创 地下迷宫

题目描述小青蛙有一天不小心落入了一个地下迷宫,小青蛙希望用自己仅剩的体力值P跳出这个地下迷宫。为了让问题简单,假设这是一个n*m的格子迷宫,迷宫每个位置为0或者1,0代表这个位置有障碍物,小青蛙达到不了这个位置;1代表小青蛙可以达到的位置。小青蛙初始在(0,0)位置,地下迷宫的出口在(0,m-1)(保证这两个位置都是1,并且保证一定有起点到终点可达的路径),小青蛙在迷宫中水平移动一个单位距离需

2017-08-18 20:27:52 588

原创 内存管理

内存管理:内存管理就是对内存构架进行管理,使程序在内存构架的任何一个层次上的存放对于用户来说是一样的。  内存管理目标:1.       地址保护,一个程序不能访问另一个程序地址空间。2.       地址独立:程序发出的地址应该与物理主存地址之间无关。进程的地址空间:逻辑地址(相对地址,虚拟地址):      用户经过编译汇编后形成目标代码,目标代码通常采

2017-08-15 14:08:57 265

原创 疯狂对列

疯狂队列时间限制:1秒空间限制:32768K小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,n个学生在列队的时候,小易老师正好去卫生间了。学生们终于有机会反击了,于是学生们决定来一次疯狂的队列,他们定义一个队列的疯狂值为每对相邻排列学生身高差的绝对值总和。由于按照身高顺序排列的队列的疯狂值是最小的,他们当然决定按照疯狂值最大

2017-08-12 20:18:42 552

原创 LeetCode练习中等卷

sum-root-to-leaf-numbersgiven a binary tree containing digits from0-9only, each root-to-leaf path could represent a number.An example is the root-to-leaf path1->2->3which represents the number12

2017-08-12 16:57:17 281

原创 shell学习笔记三

cat用法 1. 读取文件内容:cat file2. 将输入文件的内容和标准输入拼接在一起,方法如下:echo 'Text through stdin' | cat - temp.txt在上面的代码中,- 被作为来自stdin文本的文件名。3. 压缩文件空白行:cat -s temp.txt #将文本中的多个空行压缩成单个cat temp.txt | tr -s '\n

2017-08-11 11:45:14 224

原创 shell学习笔记二

键盘读入字符从输入中读取n个字符并存入变量variable_name:read –n number_of_chars variable_name例如:$ read –n 2 var$ echo $var用不回显得方法读取密码:read –s var在特定时限内读取输入:read -t timeout var例如 read –t 2 var用界定符结束输入

2017-08-10 17:44:30 181

原创 shell学习笔记一

第一章1.1 简介在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。它类似于DOS下的command和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。Shell脚本通常是以一个#!起始的文本文件,如下所示:#! /bin/bash其中#!(通常被称为shebang声明)被置于命令解释前之前(注:当只有#时,被解释为注

2017-08-10 16:25:28 449

原创 网易校招

题目描述小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11.现在给出一个N,需要求出 f(1) + f(2) + f(3).......f(N)例如: N = 7 f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1

2017-08-10 13:54:22 492

原创 腾讯2017暑期实习生编程题

构造回文串给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数。输入描述:输入数据有多组,每组包含一个字符串s,且保证:1输出描述:对于每组数据,输出一个整数,代表最少需要删除的字符个数。示例1输入abcdagoogle输出22#include#incl

2017-08-09 22:04:29 196

原创 数字和为sum的方法数

题目描述给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。输入描述:输入为两行:第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)第二行为n个正整数A[i](32位整数),以空格隔开。输出描述:输出所求的方案数示例

2017-08-08 17:15:03 370

原创 末尾0的个数

题目描述输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2输入描述:输入为一行,n(1 ≤ n ≤ 1000)输出描述:输出一个整数,即题目所求示例1输入10输出2思路:因为只有2和5相乘才会有0的出现。#include#include#includeusing names

2017-08-08 16:18:30 269

原创 解救小易

题目描述有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置)。小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界)。大反派超超想去捕捉可爱的小易,他手里有n个陷阱。第i个陷阱被安置在横坐标为xi ,纵坐标为yi 的位置上,小易一旦走入一个陷阱,将会被超超捕捉。你为了去解救小易,需要知道小易最少多少秒可能会走入一个陷阱,从而提前解救小易。输入描述:第一

2017-08-08 13:23:30 361

原创 数串

题目描述设有n个正整数,将他们连接成一排,组成一个最大的多位整数。如:n=3时,3个整数13,312,343,连成的最大整数为34331213。如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613。输入描述:有多组测试样例,每组测试样例包含两行,第一行为一个整数N(N输出描述:每组数据输出一个表示最大的整数。示例1输入212 1

2017-08-08 11:06:39 358

原创 藏宝图

题目描述牛牛拿到了一个藏宝图,顺着藏宝图的指示,牛牛发现了一个藏宝盒,藏宝盒上有一个机关,机关每次会显示两个字符串 s 和 t,根据古老的传说,牛牛需要每次都回答 t 是否是 s 的子序列。注意,子序列不要求在原字符串中是连续的,例如串 abc,它的子序列就有 {空串, a, b, c, ab, ac, bc, abc} 8 种。输入描述:每个输入包含一个测试用例。每个测试用例包含两行

2017-08-08 10:06:34 218

原创 System V共享内存

头文件#include#includeintshmget(key_t key,size_t size,int shmflg)功能:用来创建共享内存参数:a)        key:这个共享内存段名字b)       size:共享内存大小c)        shmflg:由几个权限标志构成,他们的用法和创建文件时使用的model模式标志是一样的返回值:成

2017-08-07 19:42:26 256

原创 共享内存

共享内存区是最快的IPC形式,一旦这样的内存映射到共享他的进程的地址空间,这些进程间的数据传递就不在涉及到内核,换句说就是进程不在通过执行进入到内核的系统调用来传递彼此的数据。void *mmap(void *addr,size_t len, int prot,int flags, int fd,off_t offset);功能:将文件或者设备空间映射到共享

2017-08-07 19:13:27 285

原创 进程通信值pipe管道

1. 基本概念管道是一种把两个进程之间的标准输入和标准输出连接起来的机制。管道是一种历史悠久的进程间的通信的方法,自从unix操作系统诞生之初,管道就存在了。进程创建管道,每次创建两个文件描述符来操作管道。其中一个队管道进行写操作,另一个描述符对文件进行读操作。下图显示了管道如何将两个进程通过内核连接起来的状态。管道是半双工的,只能由一端发一端接收,因此如果要实现全双工通信,必须要

2017-08-07 15:24:11 209

原创 死锁与哲学家就餐问题

死锁:死锁是指多个资源之间互相等待对方的资源,而在得到对方的资源之前又不释放自己的资源,这样,造成循环等待的一种现象,如果所有进程都在互相等待一个不可能发生的事件,则进程就死锁了。死锁产生的必要条件:1. 互斥条件:进程对资源进行排他性使用,即在一段时间内对某资源仅为一个进程所占用2. 请求和保持条件:当进程因请求资源而阻塞时,对已获得得资源保持不放3. 不可剥夺条件:进程已获得得

2017-08-07 14:18:49 1708 1

原创 POSIX 条件变量

条件变量:条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用。因此, 当一个线程互斥的访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。例如一个线程访问队列时,发现队列为空时,他只能等待,直到其它线程将一个节点添加到队列中。这种情况就可以用到条件变量。int pthread_cond_init(pthrea

2017-08-06 22:40:48 372

原创 POSIX信号量和互斥锁

POSIX信号量1 创建信号量sem_t *sem_open(const char *name, int oflag);sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);功能:初始化有名信号量int sem_init(sem_t *sem, int pshared, uns

2017-08-06 21:08:00 529

原创 线程特定数据

1. 在单线程程序中,我们经常用到全局变量以实现在多个函数间共享数据。2. 在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程共有。3. 但有时应用程序设计中有必要提供私有的全局变量,仅在某个线程中有效,却可以跨多个函数访问。4. POSIX线程库通过维护一定的数据结构来解决这个问题,这些个数据成为TSD(Thread-specific Data)。相关函数:

2017-08-06 16:17:07 256

原创 线程属性

线程属性1. 初始化与销毁属性int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t *attr);2. 获取与设置分离属性int pthread_attr_getdetachstate(const pthread_attr_t *attr,int *detachst

2017-08-06 16:16:26 165

原创 多线程服务器

Posix线程库:a) 与线程有关的函数都构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的。。b) 要使用这些库函数,要引入头文件。c) 链接这些线程库函数时要使用编译命令的”-lpthread”选项。int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void*(*start_to

2017-08-06 10:34:32 291

原创 线程和进程

程序和进程程序:完成特定功能的一系列指令的集合进程:程序的一次动态执行,代码段+数据段+堆栈段+PCB一个进程只能对应一个程序,一个程序可以对应多个进程线程:a) 在一个程序里的一个执行路线就叫做线程,更准确的定义是:线程是“一个进程内的控制序列”b) 一切进程至少都有一个执行线路进程和线程的差别:a) 进程是资源竞争的基本单位b) 线程是程序执行的最小单位

2017-08-05 21:07:42 234

原创 网络编程UDP

UDP特点:1. 无连接,不维护端到端的状态。2. 基于消息的数据传输服务,TCP是基于流的传输服务,因此TCP会出现粘包问题,而UDP不会有这种问题,认为数据包之间是有边界的。3. 不可靠,数据包可能会丢失,乱序,重复,缺乏流量控制4. 一般情况下UDP更加高效UDP注意点:1. UDP报文可能丢失,重复2. UDP报文可能会乱序3. UDP缺乏流量控制

2017-08-03 17:37:56 212

原创 并发服务器epoll

Select两个限制:1,一个进程能够打开的文件描述符个数室友限制的2, FD_SETSIZE限制Poll限制:1,一个进程能够打开的最大文件描述符是有限的通过ulimit –n numbe可以更改这个上限,但是系统能够打开的最大文件描述的个数是有限制的(内存有关),通过cat /proc/sys/fs/file-max可以查看最大限制。Select和poll共同点:内

2017-08-03 15:28:36 216

原创 并发服务器poll

用select实现的并发服务器,能达到的并发数,受两方面的限制:1. 一个进程能打开的最大文件描述符限制,这个可以通过调整内核参数。2. Select中的fd_set集合容量的限制(FD_SETSIZE),这需要重新编译内核poll提供的功能与select相似,不过在处理流设备时,他能够提供额外的信息,相比于select来说,因为select对于事件不太统一,编程比较繁琐,而poll对

2017-08-03 13:20:10 295

原创 网络编程中的close和shutdown

close终止了数据传送的两个方向,而shutdown可以有选择的终止某个方向的数据传送或者终止数据传送的两个方向,例如shutdown how=1就可以保证对等方接收到一个EOF字符,而不管其他进程是否已经打开了套接字。而close不能保证,知道套接字引用计数减到0时才发送,也就是说直到所有的进程都关闭了套接字。if(pid==0){close(listenfd);…clos

2017-08-03 10:32:26 455

原创 并发服务器select

思想:用select管理多个IO,一旦其中一个IO或者多个IO检测到我们感兴趣的时间,select函数返回,返回值为检测到的事件个数。并且会返回哪些IO发生了事件,遍历这些事假然后处理它。函数int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout

2017-08-02 22:39:17 280

原创 TCP的十一种状态

Connect主动发起连接,此时的状态为SYN_SENT,aceept接收到SYN信号后,进入到SYN_RCVD状态,然后发送一个SYN信号和应答信号,并且消耗一个序列号,然后客户端返回一个应答信号,此时双方都进入ESTABLISHID,这就是三次握手。假设客户端主动关闭,此时客户端发送一个FIN信号,此时服务器端返回为0,然后发送一个确认信号,服务器端进入CLOSE_WAIT状态,客户端进F

2017-08-02 16:30:31 378

原创 linux网络多进程编程处理僵尸进程

前面的多进程程序中,当客户端关闭后,一个子进程会关闭,但是其pdb仍然存在,通过ps -ef|grep server可以查看到,对于服务器来说,大量的僵尸进程会消耗进程控制块数目,影响服务器性能,因此僵尸进程必须处理。什么是僵尸进程?首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息。这些信息至少包括进程

2017-08-02 15:37:42 597

原创 按行读取解决粘包问题

该方案,每次读取时当读到‘\n’换行符时,读取该行服务器端:#include#include#include#include#include#include#include#include#include#define ERR_EXIT(m) do{perror(m);exit(EXIT_FAILURE);}while(1)struct packet{ int

2017-08-02 15:10:08 253

原创 网络编程获得本机IP

#include#include#include#include#include#include#include#include#include#include#define ERR_EXIT(m) do{perror(m);exit(EXIT_FAILURE);}while(0)int main(){ char host[100]; if (gethostname(h

2017-08-02 14:41:32 273 1

空空如也

空空如也

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

TA关注的人

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