- 博客(44)
- 问答 (1)
- 收藏
- 关注
原创 设计模式之 - 门面(外观)模式
一、定义 外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来。客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构。 外观模式的定义是:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。举个编译器的例子,假设编译一个
2015-05-28 15:59:48 566
原创 设计模式之 - 装饰模式
一、定义 装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机,允许你为手机添加特性,比如增加挂件、屏幕贴膜等。一种灵活的设计方式是,将手机嵌入到另一对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。
2015-05-27 17:03:04 361
原创 设计模式之 - 组合模式
一、定义将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。注意两个字“树形”。这种树形结构在现实生活中随处可见,比如一个集团公司,它有一个母公司,下设很多家子公司。不管是母公司还是子公司,都有各自直属的财务部、人力资源部、销售部等。对于母公司来说,不论是子公司,还是直属的财务部、人力资源部,都是它的部门。整个公司的部门拓扑图就是一个树形结构。
2015-05-26 22:37:20 362
原创 设计模式之 - 桥接模式
一、定义 定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里的抽象部分和实现部分不是我们通常认为的父类与子类、接口与实现类的关系,而是组合关系。也就是说,实现部分是被抽象部分调用,以用来完成(实现)抽象部分的功能。 考虑装操作系统,有多种配置的计算机,同样也有多款操作系统。如何运用桥接模式呢?可以将操作系统和计算机分别抽象出来,让它们各自发展,减少
2015-05-21 16:46:13 422
原创 进程的三种状态详解
1.进程的三种基本状态 进程在运行中不断地改变其运行状态。通常,一个运行进程必须具有以下三种基本状态。 1、就绪(Ready)状态 当进程已分配到除CPU以外的所有必要的资源,只要获得CPU便可立即执行,这时的进程状态称为就绪状态。 2、执行(Running)状态 当进程已获得CPU,其程序正在CPU上执行,此时的进程状态称为执行状态。
2015-05-19 19:42:14 4843 1
原创 设计模式之 - 适配器模式
一、定义 适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。举个例子,在STL中就用到了适配器模式。STL实现了一种数据结构,称为双端队列(deque),支持前后两段的插入与删除。STL实现栈和队列时,没有从头开始定义它们,而是直接使用双端队列实现的。这里双端队列就扮演了适配器的角色。队列用到了它的后端插入,前端删除。
2015-05-19 15:49:47 379
原创 C++构造函数调用顺序笔记
当派生类继承了基类,并且类中有基类对象作为成员变量时,构造函数的调用顺序是怎样的呢?看下面的程序:派生类继承了两个基类A和B,主函数里定义了一个派生类对象:#include using namespace std;class A{public: int x , y; char *p;public: A(int ix , int iy) { x = ix ;
2015-05-19 14:08:28 999
原创 设计模式之 - 原型模式
一、定义 原型模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。可以说,拷贝是原型模式的精髓所在。举个现实中的例子来介绍原型模式。找工作的时候,我们需要准备简历。假设没有打印设备,因此需手写简历,这些简历的内容都是一样的。这样有个缺陷,如果要修改简历中的某项,那么所有已写好的简历都要修改,工作量很大。随着科技的进步,出现了打
2015-05-18 22:18:33 431
原创 STL源码剖析 - function call操作符讲解(operator())
function call操作符(operator())C语言使用函数指针作为参数传入函数#include#includeusing namespace std;int fcmp(const void *elem1 , const void *elem2){ const int *i1 = (const int*)elem1; const int *i2 = (const
2015-05-18 15:49:00 501
原创 LeetCode OJ 之 Largest Number (最大的数字)
题目:Given a list of non negative integers, arrange them such that they form the largest number.For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.Note: The result
2015-05-18 15:26:08 410
原创 设计模式之 - 建造者模式
一、定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 一个复杂对象的创建,其通常是由很多的子对象构成;如果一个对象能够直接就创建好了,那么也不会称之为复杂对象。由于项目中需求的变化,这个复杂对象的各个部分经常会发生剧烈的变化,但是,不管怎么变化,将它们组合在一起,组成一个复杂的对象的事实是不会变的。建造者模式就提供了一种“封装机制
2015-05-17 15:38:05 392
原创 设计模式之 - 单例模式
一、引子 单例模式是设计模式中使用很频繁的一种模式,在各种开源框架、应用系统中多有应用,二、定义与结构 单例模式又叫做单态模式或者单件模式。在 GOF 书中给出的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式中的“单例”通常用来代表那些本质上具有唯一性的系统组件(或者叫做资源)。比如文件系统、资源管理器等等。单例模式的目的就是要控制特定的类只产生
2015-05-17 10:03:54 421
原创 设计模式之 - 工厂模式
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍工厂模式的实现。 工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。听上
2015-05-16 16:00:01 544
原创 数据库范式详解
一、基础概念实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,不如说“老师与学校的关系”。属性:教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。
2015-05-16 15:14:56 483
原创 剑指Offer之 - 两个链表的第一个公共结点
题目:输入两个链表,找出他们的第一个公告结点。思路:长链表先走,然后一起走。代码:#include using namespace std;//功能:输入两个链表,找出他们的第一个公共结点。struct ListNode{ int m_nKey; ListNode *m_pNext; ListNode(){} ListNode(int x):m_nKey(x
2015-05-12 11:00:10 446
原创 剑指Offer之 - 第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。思路:使用数组模拟哈希表。代码:#include using namespace std;//功能:查找字符串中第一个次数不为1的字符//先用哈希数组统计一下字符串中每个字符出现的次数,然后再遍历一下,如果次数为1,就直接返回char FirstNotRepeatingChar(char *pString){ if(
2015-05-12 10:51:03 402
原创 剑指Offer之 - 连续子数组的最大和
题目:输入一个整数数组,数组里有正数也有负数。求所有子数组的和的最大值。思路:方法很多,这里讲两种1、举例分析数组的规律。2、动态规划。代码:#include #include using namespace std;//功能:连续子数组的最大和int FindGreatestSumOfSubArray(vector num){ int len = n
2015-05-12 10:05:56 390
原创 剑指Offer之 - 字符串的排列
题目:输入一个字符串,打印出该字符串中字符的所有排列。思路:DFS。代码:#include#include #include using namespace std;//功能:求字符串全排列void dfs(string str ,vector &result , int len , int start){ if(start == len) result
2015-05-07 16:20:40 457
原创 剑指Offer之 - 复杂链表的复制
题目:复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL。实现一个函数可以复制这个复杂链表。思路:先正常复制一个结点,并把这个复制的结点置于当前结点后面。其后,再复制链表结点的m_pSibling指针,由前一个结点求出它的m_pSibling,则新结点的m_pSibling就是它的m_pSibling结
2015-05-07 16:08:22 535
原创 剑指Offer之 - 二叉树中和为某一值的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。思路:深度优先搜索。代码:#include#include using namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; Bina
2015-05-07 15:42:12 374
原创 剑指Offer之 - 二叉搜索树的后续遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历的结果。思路:根据二叉搜索树的后续遍历结果的特点来判断:序列的最后一个数是根结点,且前面一部分的数 最后一个数。类似这样的数组:5,7,6,9,11,10,8如果满足上面的条件,然后再对两部分进行递归判断,否则直接返回false。代码:#include#include #includeusing
2015-05-07 15:08:40 411
原创 剑指Offer之 - 从上往下打印二叉树
题目:按层打印二叉树。思路:用队列实现。代码:#include#include #includeusing namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; BinaryTreeNode(){}; Bin
2015-05-07 14:47:30 387
原创 剑指Offer之 - 栈的压入、弹出序列
题目:输入两个整数序列,第一个表示压入顺序,判断第二个序列是否是该栈的弹出序列。比如:压入序列1,2,3,4,5,则序列4,5,3,2,1是弹出序列,但是序列4,3,5,1,2就不可能是弹出序列。思路:把第一个序列的数入栈,直到遇到可第二个序列的数相等。如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。否则入栈,比如1 != 4 ,则把1入栈。直到4 == 弹出的数字4
2015-05-07 14:26:17 451
原创 剑指Offer之 - 包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push,pop函数的世界复杂度都是O(1)。思路:维护一个辅助栈s2,用来存储当前栈中的最小元素比如栈s1 : ,辅助栈s2就是: 代码:#include#include using namespace std;//功能:定义栈的数据结构,请在该类型中实
2015-05-07 14:14:49 408
原创 剑指Offer之 - 顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以逆时针的顺序依次打印出每一个数字。思路:按圈打印,每次打印一圈。每一圈只要知道左上角的起始点,就能算出这一圈的其他三个角。代码:#includeusing namespace std;//旋转打印二维数组void PrintMatrixInCircle(int **numbers , int columns , int rows ,
2015-05-07 14:07:19 505
原创 linux中的 inode 详解
一、inode是什么?理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八
2015-05-06 15:58:17 811
原创 剑指Offer之 - 树的镜像
题目:输入一个二叉树,求该函数的镜像二叉树。镜像二叉树如下图所示:思路:左右孩子互换,然后递归调用。代码:#include using namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; BinaryTr
2015-05-05 16:47:33 390
原创 剑指Offer之 - 树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。思路:先在A中找到一个结点的值和B的根结点值相同的结点,然后再判断以这个结点为根结点的数和树B是否相等(不是相等,而是B是否是A的子树)。代码:#include using namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_
2015-05-05 16:41:17 364
原创 剑指Offer之 - 合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。思路:1、迭代(注意定义虚拟头结点)。2、递归。代码:#include using namespace std;struct ListNode{ int m_nValue; ListNode *m_pNext; ListNode(){} ListNode(int x):m_n
2015-05-05 16:30:12 405
原创 剑指Offer之 - 反转链表
题目:输入一个链表头结点,反转该链表,并输出反转后链表的头结点。思路:……代码:#include using namespace std;struct ListNode { int m_nKey; ListNode *m_pNext; ListNode(){} ListNode(int x):m_nKey(x),m_pNext(NULL){}};//功能:
2015-05-05 16:17:38 372
原创 剑指Offer之 - 链表中倒数第k个结点
题目:输入一个链表,输出该链表中倒数第k个结点。思路;两个指针。一个指针先走k步,然后两个指针同时走,直到第一个指针走到最后,这样第二个指针就到了倒数第k个结点。注意:k有可能大于链表长度。代码:#include using namespace std;struct ListNode{ int m_nValue; ListNode *m_pNext; List
2015-05-05 16:08:06 315
原创 剑指Offer之 - 调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数维护数组的后半部分。思路:两个指针,一个指向开头,一个指向末尾。代码:#includeusing namespace std;//功能:把数组里的奇数放在前面,偶数放在后面//解法1:两个指针,一个在前一个在后void ReorderOddEven(int *pDa
2015-05-05 15:43:04 369
原创 剑指Offer之 - 在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。思路:3种情况:1、只有一个结点,且要删除的就是第一个结点???遇到链表时一定要单独考虑只有一个结点的情况 2、要删除的结点不是最后一个结点,这时不需要查找,直接用后面一个结点的值代替前面一个结点,然后删除后一个结点 3、要删除的结点是最后一个结点,这时需要先遍历到倒数第二个结点代码
2015-05-05 14:39:15 412
原创 剑指Offer之 - 打印1到最大的n位数
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数,即999.思路:如果输入n很大,则不能用int或者long long来表示,这里用字符串来模拟数字,只需要n+1位即可。代码:#include using namespace std;//功能:给定数组x,求从1到x位最大数,并打印出来。即如果x = 2,则打印1 2
2015-05-05 14:25:12 392
原创 剑指Offer之 - 数值的整数次方
题目:实现函数double Power(double base , int exponent) ,求base 的 exponent次方。不考虑大数问题。思路:1、n次迭代2、二分递归法考虑情况:1、底数为0(如何判断double类型为0),指数为负(无效输入) 2、指数为负时,先算正,再求倒数代码:#include us
2015-05-04 15:52:43 363
原创 剑指Offer之 - 二进制中1的个数
题目:求一个数的二进制表示形式中的1的个数。思路:1、用1,从n的后面往前依次与n相与即可2、把一个数-1的结果就是把它的二进制形式的最后一个1去掉,而后面的全变成1,如1111 1100 - 1 = 1111 1011然后二者相与,得到的结果相比于原来的数就减少1个1,直到结果为0。即 1111 1100 & 1111 1011 = 1111 1000 。代码:#in
2015-05-02 17:15:26 376
原创 剑指Offer之 - 斐波那契数列
题目:应用:青蛙跳台阶,爬楼梯,小矩形覆盖大矩形……思路:1、 递归2、 迭代代码:#include using namespace std;//斐波那契数列//应用:青蛙跳台阶,爬楼梯,小矩形覆盖大矩形long long fibonacciRecurisely(int n){ if(n == 0 || n == 1) retur
2015-05-02 17:07:44 358
原创 剑指Offer之 - 旋转数组的最小数字
题目:找出旋转数组中的最小数字。思路:有两种情况,数组没有重复数字和有重复数字分别参考:http://blog.csdn.net/u012243115/article/details/41923667 和 http://blog.csdn.net/u012243115/article/details/41924217 。代码:#include using namespac
2015-05-02 16:32:55 345
原创 剑指Offer之 - 用两个栈实现队列
题目:用两个栈实现一个队列。思路:[1] 入队列就直接把数据放到第一个栈里[2] 出队列就判断第二个栈是否为空,不为空的话,第二个栈直接出栈结果就是出队列,若为空就把第一个栈里的数据转移到第二个栈里,然后第二个栈再出栈代码:#include #include using namespace std;//功能:用两个栈实现一个队列的添加元素和删
2015-05-02 16:28:10 514
空空如也
关于fork和cout<<'\n'的一个问题
2015-04-11
TA创建的收藏夹 TA关注的收藏夹
TA关注的人