自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

菜鸟成长记

菜鸟成长中的点滴记录

  • 博客(50)
  • 资源 (1)
  • 收藏
  • 关注

原创 【图】最短路径--迪杰斯特拉(Dijkdtra)算法

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。算法思想 每次找到离源点最近的一个顶点,然后以该顶点为中心,然后得到源点到其他顶点的最短路径。贪心算法。举例分析以邻接矩阵为存储图注:上图中,邻接矩阵的对称线也是无穷大,在初始时默认为无穷大。可以看上篇博客,图的存储。(1)

2017-07-31 23:22:29 26314 12

原创 【图】图的遍历以及最小生成树

图的遍历图的遍历图和树的遍历类似,那就是从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这个过程就叫做图的遍历。对于图的遍历来说,如何避免因回路陷入死循环,就需要科学地设计遍历方案,通过有两种遍历次序方案:深度优先遍历和广度优先遍历。1、深度优先遍历 DFS深度优先遍历(Depth_First_Search),也称为深度优先搜索,简称DFS。沿着树的深度遍历树的节点,尽可能深的搜索树

2017-07-31 16:27:34 2906

原创 【图】图的相关概念以及图的存储

图的定义图是一种复杂的非线性结构。在图形结构中,节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关。图G由两个集合V(顶点Vertex)和E(边Edge)组成,定义为G=(V,E)。图的相关概念1、无向图无向边:若顶点Vi到Vj之间的边没有方向,则称这条边为无向边,用无序偶对(Vi,Vj)来表示。如果图中任意两个顶点时间的边都是无向边,则称该图为无向图, G=(V, {E})、0≤边≤n

2017-07-31 13:35:26 564

原创 【笔试题】CVTE C++开发岗笔试题7.29

cvte的笔试题 一如既往,20道不定项选择题,2道编程题。 感觉题不是特别难,都是基础题,涉及的范围 C++: C++11,sizeof, 数据结构:二叉树,排序算法,二分查找,最短路径(Dijkstra算法), 操作系统:cp命令,产生死锁的条件,文件权限,虚存管理和实存管理, 网络:OSI七层模型,数据链路层的设备,大概记得就是这么多了。20道选择题1、sizeof 是C语言中计算

2017-07-29 21:56:48 3820

原创 【二叉树】将二叉搜索树转换成一个排序的双向链表

问题描述输入一棵二叉搜索树,将该二叉搜索树转换程一个排序的双向链表。 要求不能创建任何新的节点,只能调整树中节点指针的指向。 也就是left当prev,right当next。–中序线索化的变型。 分析解决问题将上述二叉搜索树看成三个部分:值为10的根节点,值为6的左子树,值为14的右子树。 根据排序链表可以看出来,值为10的根节点的前序是它左子树中最大值为8的节点,后继是它右子树中最小值为12

2017-07-29 18:18:16 770 1

原创 【C++】实现Singleton模式

单例模式,就是设计一个类,我们只能生成该类的一个实例。 而单例模式的实现方式有两种:懒汉模式和饿汉模式懒汉模式懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。实现1、教科书构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存

2017-07-29 17:37:32 700 1

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

这个问题主要考察的是C和C++的区别,以及C++中继承和多态的概念。C和C++的区别C语言是面向过程的语言,而C++是面向对象的过程。什么是面向对象和面向过程? 面向过程就是分析解决问题的步骤,然后用函数把这些步骤一步一步的进行实现,在使用的时候进行一一调用就行了,注重的是对于过程的分析。面向对象则是把构成问题的事进行分成各个对象,建立对象的目的也不仅仅是完成这一个个步骤,而是描述各个问题在解决的过

2017-07-28 12:36:45 17531 4

原创 【二叉树】由前序遍历和中序遍历重建二叉树

问题分析遍历组合确定唯一的二叉树,必须包含中序遍历 前序遍历和中序遍历重建二叉树, 前序遍历:根->左->右,中序遍历:左->根->右可以看出二叉树前序遍历序列中,第一个元素总是树的根节点的值。中序遍历序列中,左子树的节点的值位于根节点的值的左边,右子树的节点的值位于根节点的右边。思路:递归处理 (1)取前序遍历中的节点,在中序遍历中找到对应的值,划分为左右子树 (2) 构建根节点的左右子树

2017-07-28 10:45:37 604

原创 【树】求树中两个节点的最低公共祖先

求树中的两个节点的最低公共祖先,是一组题目,不同条件下的题目是完全不一样的。情形1、二叉搜索树分析:如果树是二叉搜索树的话,就比较容易解决。因为二叉搜索树的特性,左子树的上节点的值比根节点小,右子树上节点的值比根节点大。思路:从树的根节点开始和两个输入的节点进行比较。(1)如果当前节点的值比两个节点的值都大,最低公共祖先结点一定在当前结点的左子树。(2)如果当前节点的值比两个节点的值都小,最低公共祖

2017-07-27 21:11:36 1239

原创 【二叉树】层次遍历二叉树以及判断一棵树是否是完全二叉树

层次遍历二叉树分析:层次遍历二叉树也称广度优先遍历,是一层一层的遍历二叉树,可以借助队列,先进先出。 注:与前序遍历的非递归有点像,一个是栈,一个是队列void LevelOreder(Node *pRoot){ cout << "层次遍历 "<<endl; if(pRoot == NULL) return ; queue<Node *> q; q

2017-07-27 18:06:52 2160

原创 【二叉树】树的子结构/判断一个节点是否在二叉树中

树的子结构问题分析 输入两棵二叉树A和B,判断B是不是A的子结构思路: 1、在树A中找到和B根节点值一样的节点R 2、再判断树A中以R节点为根节点的子树是不是包含和树B一样的结构。代码实现//步骤1,找一样的节点bool HasSubTree(TreeNode* pRoot1, TreeNode * pRoot2){ bool res = false; if (pRoot1

2017-07-27 15:40:46 1786 1

原创 【链表】两个单链表求差集

问题描述已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。 链表结点的结构类型定义如下: struct node { int data; node* next; }; 请完成函数voi

2017-07-27 14:41:56 7393 2

原创 【二叉树】判断一棵二叉树是否是平衡二叉树/求一棵二叉树的镜像/对称的二叉树

求一颗二叉树的镜像分析问题 镜像就是相反的东西,对于二叉树而言,将左子树改成右子树,右子树改成左子树。 递归实现1 可以采用递归的思路,前序遍历 依次交换当前根节点的左右孩子,再分别求左右子树镜像。 注:该方法改变了原来的树的结构void Mirror(Node *pRoot){ if(pRoot == NULL) return ; if(pRoot->l

2017-07-27 13:38:42 370

原创 【二叉树】实现二叉树的前序、中序、后序的非递归遍历

二叉树的前序、中序、后序遍历的递归算法很好实现,这就不写了。非递归的实现肯定要借助栈来实现前序非递归的实现:根->左->右实现1、 借助栈的后进先出的思想,将根节点放入栈中,然后访问栈顶元素(根),然后将右孩子入栈,再将左孩子入栈,由于栈是后进先出,所以先出栈的是左孩子,这样就实现了先访问根,再访问左孩子,最后访问右孩子。void PreOreder_Nor(Node* pRoot){

2017-07-27 11:04:40 683 2

原创 二维数组中的查找

问题描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,请完成这样一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。问题分析例如下面得二维数组就是每行每列都递增的排序。如果查找数字7,返回true;如果查找数字5,返回false。1 2 8 92 4 9 124 7 10 136 8 11

2017-07-26 17:51:25 372 1

原创 基于多线程Http服务器的查询天气

1、项目简介前段时间阅读了源码tinyHttpd, TinyHttpd—-超轻量型Http Server源码分析 然后基于这个实现一个查询天气的功能,以及该服务器能够连接数据库的功能。2、项目的背景知识(1)该项目在Linux系统下开发的,熟悉Linux的开发环境。 (2)熟悉掌握多线程编程 (3) 熟悉掌握网络协议中的HTTP以及网络编程 (4) 熟悉mysql的基本命令 (5)了解my

2017-07-24 22:06:19 636 1

原创 网络群聊系统

1、网络群聊系统简介简单来说,这个聊天系统是参照《Linux高性能服务器编程》中有个简单的聊天系统实现的群聊功能。服务器端负责接收客户端的消息,放到数据池中,还负责从数据池中取出数据转发给在线的客户端;每个客户端负责发送和接收数据,还负责数据的序列化和反序列化。2、网络群聊系统背景知识(1)在Linux操作系统下实现,本人用的是CentOS 6.5 (2)熟悉Linux的开发环境,使用vim,g+

2017-07-24 17:29:34 4840 8

原创 【二叉树】二叉树的高度以及创建 销毁二叉树

更多的二叉树题 二叉树面试题二叉树的高度分析:求二叉树的高度,可以用递归的思想,先求出左子树的高度,再求出右子树的高度,然后取他们的最大值+1。int GetHight(Node *pRoot){ if(pRoot == NULL) return 0; if(pRoot->left == NULL || pRoot->right == NULL) return 1;

2017-07-23 13:15:49 728

原创 一个数组中有一个数字的次数超过了数组的一半

问题描述一个数组中有一个数字的次数超过了数组的一半,求出这个字符。如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2。问题分析方法1、时间复杂度O(N)思路: 如果一个数出现的次数超过数组一半的长度,那么就是说出现的次数比其他所有数字出现的次数还要多。因此我们可以考虑保存2个值,一个是数组中的一个数,一个是数的次数。当我们遍历到下一个数字的时候,如果下一个

2017-07-23 12:58:56 662

原创 【阶乘】阶乘相关的题

1、如何求N的阶乘所得的数字末尾含有多少个0分析问题:N!=1×2×3×4×5×6×··· ×N 对N!分解质因数,N!=2x ×3y ×5z 可以看到2和5相乘必然会产生一个10,而这个10会在阶乘的末尾添加一个0。那么问题就转化为2x ×5z 可以产生多少个0,即min(x,z),显然X肯定大于Z(能被2整除的数肯定比5多), 最终问题转化为求Z的值-即找出1…N能分解出多少个5,方法1、i

2017-07-21 11:52:54 2091

原创 计算一个整数二进制位中1的个数

计算一个整数二进制位中1的个数。普通法这种方法是每个人都能想出来的,最直观的方法,移位+计数。int BitCount(unsigned int n){ size_t c =0 ; // 计数器 while (n >0) { if((n &1) ==1) // 当前位是1 ++c ; // 计数器加1 n >>=1 ;

2017-07-20 22:22:29 611

原创 【栈队列】判断出栈顺序的合法性

问题描述元素出栈、入栈顺序的合法性。如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),则合法。入栈的序列(1,2,3,4,5),出栈序列为(4,5,2,3,1),则不合法。问题分析直观的思路就是将入栈序列一个一个入栈,与出栈序列相比较,一样就出栈,不一样就继续入栈,当入栈序列和出栈序列都为空时,表示出栈顺序合法。建立一个辅助栈 把输入的第一个序列中的数字一个一个压入该辅助栈,并

2017-07-20 22:08:18 11376

原创 【Linux】Linux下c++使用Json库

安装Json库1、下载Jsoncpphttps://sourceforge.net/projects/jsoncpp/files/2、下载scons https://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.tar.gz/download3、解压scons-2.1.0.tar.gztar -zvxf scons-2.

2017-07-20 21:38:42 1836

原创 【库连接问题】makefile中如何连接库以及解决/usr/bin/ld: skipping incompatible问题

关于如何连接库,这里只记录自己碰到的一些问题编写Makefile编译时 -c 生成.o 文件:后面要加-I (指明包含的头文件)链接时 -o 生成可执行文件:-L(指明库的位置) -l(指明库的名字)还有一个是在引用json库的问题: lib文件下有两个文件夹 include和 lib文件夹 include 文件夹中有一个文件夹json,里面又包含着json的头文件 lib文件中放着libjs

2017-07-20 16:06:55 25942 4

原创 【字符串】查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)

问题描述:查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)。分析问题:方法1、O(N^2) 看到这道题时,最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果后面出现两次该字符,那么该字符为第一个只出现两次的字符(注:内存循环需要全部遍历完字

2017-07-19 10:24:18 1835

原创 【栈队列】实现一个栈Stack,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1)

问题分析要记录从当前栈顶到栈底元素的最小值,很容易想到用一个变量,每push一个元素更新一次变量的值。那么问题来了,当执行pop操作时,上一次的最小值就找不到了。解决方法方法1、 使用一个栈。元素x入栈时,执行一次push(x),再push(min),min表示当前栈顶到栈底元素最小值;元素出栈时,执行两次pop()看上图中的例子,蓝色的为最小值,push:先比较当前栈顶的最小值与插入的值,记录两

2017-07-19 09:46:19 4527 2

原创 【Python】实现一个天气查询

实现一个桌面版的天气查询天气API 首先找获取天气的API:点击查看天气api 可能这篇博客写的有点乱,我来总结一下http://wthrcdn.etouch.cn/weather_mini?city=北京通过城市名字获得天气数据,json数据http://wthrcdn.etouch.cn/weather_mini?citykey=101010100通过城市id获得天气数据,json数据

2017-07-18 22:56:03 4831

原创 【字符串】字符串替换空格

问题描述题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出”We%20are%20happy”。分析问题正常思路都是,找到每个空格,将后面的元素向后移动,然后插入%20, 假设字符串的长度为n,对每个空格字符,需要移动后面O(n)个字符,因此对含有O(n)个空格的字符串而言时间复杂度为O(N^2)另一种思路: 先遍历字符串,计算出空格的总个

2017-07-18 10:30:08 481

原创 【栈队列】两个栈实现一个队列、两个队列实现一个栈

两个栈实现一个队列分析问题:栈的特性是后进先出,而队列的特性是先进先出,可以这样考虑,用其中一个栈作为辅助栈,栈s1,作为入队的栈,栈s2作为出队的辅助栈。 方法1、 入队:直接压入栈s1中, 出队:如果s1不为空的话,先把s1中的元素全部弹出压入s2中,s1为空的话,直接弹出s2的栈顶,注意:s1和s2都为空的话,那么队列为空。template<class T>class Queue{

2017-07-18 10:10:37 249

原创 【链表】删除一个无头单链表的非尾节点 以及从尾到头打印单链表

删除一个无头单链表的非尾节点分析:最直观的思路,删除一个节点,需要知道该节点的前一个节点,然后将该节点的前一个节点指向该节点的下一个节点。 思路:可将删除的节点的下一个节点 覆盖掉当前要删除的点,然后原删除的节点指向下一个节点的下一个节点。//确保posNode不是尾节点void DelNotTailNode(Node *posNode){ if (posNode) {

2017-07-17 13:23:55 346

原创 【链表】复杂链表的复制

问题描述请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个next指针指向下一个结点之外,还有一个random指向链表中的任意结点或者NULL。结点的定义如下struct RandomListNode { int label; struct RandomListNode *next

2017-07-17 13:14:46 331

原创 【Linux】fork函数的理解

fork函数总结先说下fork函数 在Unix/Linux中用fork函数创建一个新的进程。进程是由当前已有进程调用fork函数创建,分叉的进程叫子进程,创建者叫父进程。该函数的特点是调用一次,返回两次,一次是在父进程,一次是在子进程。两次返回的区别是子进程的返回值为0,父进程的返回值是新子进程的ID。子进程与父进程继续并发运行。如果父进程继续创建更多的子进程,子进程之间是兄弟关系,同样子进程也可

2017-07-16 18:31:27 601

原创 【链表】判断两个链表是否相交,并求出交点

问题描述:判断两个链表是否相交,并求出交点。简单分析:考虑到链表是否带环的问题,可分为3种情况,1、两个链表都不带环2、其中一个链表带环(根本就不可能相交)3、两个链表带环下面具体情况具体分析 注:判断链表是否带环,可以查看上一篇博客 判断链表是否带环1、两个链表都不带环分析情况:如果两个链表不带环且相交的话,有两种思路: 思路1、 遍历两个链表,如果相加相交的话,最终的结尾点是相等的。但

2017-07-16 16:54:33 629

原创 【链表】判断链表是否有环,环的长度,环的入口点

问题描述:给出一个单链表的头结点,1、判断该链表是否有环;2、带环的话,求出环的长度,3、求出环的入口位置。1、判断是否带环,(求出环中相遇的点)分析:如果链表带环的话,那么遍历链表的话,就是一个死循环; 那么可以用追赶的方式,定义两个指针,一个走一步,另一个走两步,最终有环的话,两个指针指向同一个节点。注:如果带环的话,该函数返回的是环中相遇的点。//求环中相遇的节点Node* IsHaveC

2017-07-16 13:21:57 933

原创 设计一个类只能在堆(栈)上创建

在C++中,创建类的对象有两种方法,一种是静态建立,A a; 另一种是动态建立,调用new 操作符。静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数。动态建立类对象,是使用new运算符将对象建立在堆空间中。这个过程分为两步,第一步是执行operator new()函数,在

2017-07-16 01:02:06 1169

原创 【不用加减乘除做加法】

问题描述:求两个整数的和,要求不能使用加减乘除思路:不用加减乘除,还可以使用位运算,类似于加法的三步:每个位相加不进位;计算进位;再次相加位运算的三步:第一步:异或,可以让1+1 = 0,0+0=0,1+0=1;第二步:与,可以让1+1 = 1,0+1=0,0+0=0,再左移一位,得到进位,第三步:循环前两步//考虑 用位运算:1 异或不产生进位,2与 左移一位 再相加int Add(int num

2017-07-14 12:05:55 381

原创 实现1+2+3+...+n。要求不能使用乘除法,for,while,if,else,switch,case,等关键字及条件判断语句。

问题:求1+2+3+…+n,要求不能使用乘除法,for,while,if,else,switch,case,等关键字及条件判断语句。解决思路:一般思路就是循环,递归,或者公式n(1+n)/2方法一:利用构造函数求解思路:可以让构造函数重复执行++操作class Temp{public: Temp() { N++; Sum += N; }

2017-07-14 11:57:32 1560

原创 【链表】查找链表倒数第k个结点,要求只能遍历一次

解决思路:定义两个指针,一个指针先走k步,然后同时走,当快的指针走到结尾是,慢的指针正好走到倒数第k个。注意:最后一个结点是倒数第0个考虑:结点个数小于k个,k<=0;头结点为空//查找链表的倒数第k个结点(最后一个是倒数第0个),要求只能遍历一次链表//思路:定义两个指针,一个先走k步,然后同时走到尾//考虑的问题:结点个数小于k个,k<=0;头结点为空Node* FindKtnToTail

2017-07-14 11:46:00 591

原创 【链表】反转/逆置 链表,以及升级版Node* RotateList(Node* list, size_t k)

问题描述:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。考虑:1只有一个结点。2、链表为空//思路:定义三个指针,改变链表结点的指向//考虑 1一个结点,没有及诶单Node *ReverseList(Node* pHead){ Node* ReverseHead = NULL; Node* pNode = pHead; Node* pPrev

2017-07-14 11:42:16 326

原创 【链表】合并两个有序链表,合并后链表依旧有序

链表的结点结构struct Node{ Node(int value) :_value(value) , _next(NULL) {} int _value; Node* _next;};问题描述:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然按照递增排序的。解决问题:方法一 递归版本Node* Merge(Node *pHead1,

2017-07-14 11:38:58 590

c# 编写 人力资源管理系统

编写的简单 人力资源管理系统,其中链接 数据库

2016-07-11

空空如也

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

TA关注的人

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