自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 资源 (2)
  • 收藏
  • 关注

原创 面试题--本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果

本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。 void GetFavoriteFruit(const vector& fruits,size_t

2017-07-31 15:31:37 2569

转载 C++的单例模式与线程安全单例模式(懒汉/饿汉)

单例模式 单例模式:是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。  实现简单的单例模式:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例。cl

2017-07-30 17:06:12 433

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

思路: 二叉搜索树本来就是已经排好序的,左比根小右比根大。 所以我们将左子树的最右的节点与根相连并且将根与右子树中最左边的结点相连接。 之后对子树进行递归操作。 void ConvertNode(BinaryTreeNode* pNode,BinaryTreeNode** pLastNodeInList){ if(pNode == NULL) return ;

2017-07-30 13:19:53 447

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

C语言与C++语言的不同?C语言是面向过程的语言。 C++语言是面向对象的语言。面向过程:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。 面向对象:面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。继承与多态?继承: 继承机制是面向对象程序设计使代码进行复

2017-07-28 22:48:56 488

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

由前序遍历和中序遍历重建二叉树(前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5) 思路: 前序遍历第一个是根节点。 中序遍历根节点左侧为左子树,根右侧为右子树。 那么先构造根节点,根节点左侧都为左子树,根右侧都为右子树。 然后对左右子树递归式的构造即可。//封装BinaryTreeNode* Construct(int * preorder, int* inorde

2017-07-28 14:10:00 501

原创 二叉树--求二叉树中两个节点的最近公共祖先

求二叉树中两个节点的最近公共祖先。类型1:二叉树每个节点有parent(三叉链)如果有父亲结点,那就可以反向遍历当成两个链表找第一个公共结点即可。 这时候头为两个结点,尾为二叉树的根节点BinaryTreeNode* GetLastCommonAncestor(BinaryTreeNode* pRoot, BinaryTreeNode* p1,BinaryTreeNode* p2){

2017-07-28 00:09:12 2020

原创 二叉树--判断一棵树是否是完全二叉树

完全二叉树: 前n-1层都是满的,第n层如有空缺,则是缺在右边,即第n层的最右边的节点,它的左边是满的,右边是空的。如何判断一个树是否为完全二叉树? 思路一:将所有的结点全部押入队列中,空也压入,每次判断队列的头如果队列头为空了则跳出循环,如果此后队列中还有元素则不是完全二叉树。bool IsCompleteTree(BinaryTreeNode *pRoot){ if(pRo

2017-07-27 19:16:05 5287

原创 二叉树--判断一颗二叉树是是否是另一颗树的子树。比如tree2是tree1的子树。

思路:先判断根,根相同再判断左右子树如果所有的都相同,则此树是另一个树的子树。 如果只有根相同,则向下继续找和跟相同的结点。再进行如上相同的操作。bool HasSubTree(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2){ bool ret = false; if(pRoot1 != NULL && pRoot2 != NUL

2017-07-27 16:22:51 509

原创 链表--已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。

已知集合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 elem; node* next; }; 思路

2017-07-27 11:02:36 716

原创 二叉树--判断一个节点是否在一棵二叉树中。

思路: 递归:找左找右递归。bool IsNodeInTree(BinaryTreeNode<T>* pRoot,BinaryTreeNode<T>* pNode){ if(pRoot == NULL || pNode ==NULL) return false; if(pRoot == pNode) return true; if

2017-07-26 23:30:30 2459

原创 二叉树--实现二叉树的前序/中序/后序非递归遍历。

思路:都用到栈,用栈来存储结点//先序非递归,根左右,循环处理,先打印根再压左子树,再压右子树void PreOrder_Nor(BinaryTreeNode<T>* pRoot){ if(pRoot == NULL) return ; stack<BinaryTreeNode<T>*> s; s.push(pRoot); while(!

2017-07-26 23:09:54 338

原创 矩阵找数--一个m*n的矩阵,从左到右从上到下都是递增的,给一个数x,判断x是否在矩阵中。要求效率尽可能的高。

思路一:循环找 效率差思路二: 因为从左到右从上到下都是递增的。 所以用数字和右上角的数字比较 如果要找的数字是7,则数字先与9比。比9小说明在9的左侧。 再与8比,比8小,说明在8的左侧。 与2比,比2大,在2的下侧。 比4大,在4的下侧。bool Find(int * arr,int row,int col,int num){ bool isFound = false;

2017-07-26 22:07:51 3061

原创 二叉树--判断一棵二叉树是否是平衡二叉树&&求一颗二叉树的镜像

平衡二叉树:此树中任意一个左右子树的高度差小于等于1 递归思路://求高度size_t Height(BinaryTreeNode<T>* pRoot){ if(pRoot == NULL) return 0; int LeftHeight = Height(pRoot->Left) + 1; int RightHeight = Height(

2017-07-26 22:04:40 302

原创 超过一半的数字--一个数组中有一个数字的次数超过了数组的一半,求出这个字符。

思路一: 时间复杂度是O(N),只用遍历一次即可。 因为此数字出现的次数超过了整个数组的一半,所以我们挨个遍历,当后面的字符/数字和前面的一样时,则计数器++,不一样计数器–。如果最后计数器大于0,则有超过一半的字符/数字切此数字就是最后一次将计数器++的那个数字,否则则没有。int MoreHalfNum(T *arr,int len){ assert(arr); if(

2017-07-26 17:10:56 771 3

原创 二叉树--求二叉树叶子节点的个数/求二叉树第k层的节点个数。

求二叉树叶子节点的个数思路:左子树的叶子节点的个数+右子树叶子节点的个数int GetLeefNode(BinaryTreeNode<T>* pRoot){ if(pRoot == NULL) return 0; if(pRoot -> left == NULL && pRoot -> right == NULL) return 1;

2017-07-26 17:09:23 997

原创 链表--链表K个翻转

链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6。思路:分开旋转再合并先写旋转的函数 前闭后开,从pHead到pEnd-1的旋转ListNode* ReverseList(ListNode * pHead,ListNode* pEnd){ ListNod

2017-07-23 13:08:12 459

原创 二叉树--求二叉树的高度/销毁一颗二叉树

求二叉树的高度 思路: 递归:求左子树的高度,求右子树的高度,最后看哪个高度高选哪个。size_t Height(BinaryTreeNode<T>* pRoot){ if(pRoot == NULL) return 0; int LeftHeight = Height(pRoot->Left) + 1; int RightHeight = H

2017-07-23 10:46:33 629

原创 求0个数--给定一个整数N,那么N的阶乘N!末尾有多少个0呢?

思路:方法一: 有多少个0取决于有多少个10; 所以只要找出10的个数即可,10取决于2*5,所以只要找出num中有多少个2为公约数的数和5为公约数的数, 又因为是阶乘,数是递增的,有2为公约数一定有5为公约数。 所以找出5为阶乘的数即可。 拿15为例 3个0 (2*5) 10 (12*15)int CountZero (int num ){ int cou

2017-07-21 11:06:31 831

原创 二叉树--实现一颗二叉树的层序遍历

思路: 当此结点不为空时,输出此结点并把左右子节点放到队列中,按队列输出并做循环。当队列为空时则打印结束。void Print_Level(BinaryTreeNode* pRoot){ if(pRoot == NULL) return ; queue<BinaryTreeNode*>q; q.push(pRoot); while(!

2017-07-21 10:21:25 369

原创 栈--元素出栈、入栈顺序的合法性问题

思路:参数传一个入栈顺序和出栈顺序。 定义一个辅助栈,循环条件是压入栈的元素个数。 依次把入栈序列的元素压入辅助栈中,如果某一次辅助栈栈顶==出栈序列栈顶并且辅助栈不为空,则把辅助栈pop,并在出栈次数上++。 如果出了循环,辅助栈为空并且入栈次数等于出栈次数,则是合法的序列。 否则缺一不可,就是不合法的。bool IsPopOrder(vector<int> pushV, vector<i

2017-07-21 00:25:11 536

原创 计算1个数--计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。

错误方法: 数字右移,这里会涉及到移位的规则。 移位规则: 左移运算符m<<表示把m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在右边补上n个0; 右移比左移稍微复杂一些,如果数字是一个无符号值或正数,右移时最左边补0; 如果数字是一个负数,则最左边补1。//以下是有缺陷的写法//如果给一个负数,则右移右边会一直补1,会导致死循环。int CountOf1(int n){

2017-07-20 15:18:33 744

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

思路: 建立一个str2[256]的定长数组存放字符个数。 先遍历str1,将str1的元素个数逐个写入str2对应的下标处。 由于要找第一个出现的,所以遍历str1,按照每个元素依次查找,找到次元素对应下标的str2==‘2’的时候,返回该元素。这里有两个循环但是不嵌套,所以时间复杂度O(N),用到了一个定长的辅助空间,所以空间复杂度也满足题意。char FindSencond(char *

2017-07-19 10:23:18 971 3

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

思路:给一个辅助栈,辅助栈栈顶就为最小的元素,当有新元素进来时与辅助栈的栈顶作比较,如果新来的比辅助栈的栈顶小,就把新来的给辅助栈。template<class T>class StackWithMin{public: StackWithMin() {} ~StackWithMin() {}public: void push(const T& v

2017-07-19 09:56:04 667

原创 字符串替换--替换字符串中的空格为$$$。要求时间复杂度为O(N)

思路: 先遍历一遍字符串找出空格的数目,有空格则把空格数+1. 两个指针,一个指向原字符串结尾,一个指向替换后的字符串末尾。替换后的字符串长度等于原字符串长度+2*空格数。 循环结束的条件是oldend=newend,就停止循环。char* Repalce (char * str ){ int blank = 0; int newlen = 0;

2017-07-19 00:09:16 845

原创 栈&队列--使用两个栈实现一个队列+使用两个队列实现一个栈

使用两个栈实现一个队列思路一: 队列先进先出,栈先进后厨。 用两个栈实现一个队列。 先将数据压入栈stack1中,当stack2为空的时候,把stack1的输出弹出并压入stack2。template<class T>class CQueue{ public: CQueue (void); ~CQueue (void);

2017-07-18 23:19:11 267

原创 一个朴素的基于HTTP协议的项目

1.这个项目是干嘛的?这个项目主要是实现前后端数据的连通。从前端网页收到的数据经过处理一直存储到后台的mysql数据库。2.项目所用到的知识1.什么是HTTP协议: 参考我往期博客: http://blog.csdn.net/sayhello_world/article/details/750185192.什么是mysql,怎么用? http://blog.csdn.net/sayhello_

2017-07-18 17:39:49 1043

原创 Linux下安装及使用mysql

什么是数据库数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方

2017-07-18 14:31:10 697

原创 链表--从尾到头打印单链表

方法一:栈 因为栈是先进后出,所以先将链表全部压入栈,在将栈pop()并输出即可。void PrintLast(ListNode* pHead){ std::stack<ListNode*> s; ListNode* pCur = pHead; while(pCur) { s.push(pCur); pC

2017-07-18 00:54:14 278

原创 链表--删除一个无头单链表的非尾节点

方法: 因为是无头的(参数不传头),所以不能遍历。 判断此结点是不是要删除的结点,如果是,则将下一个值覆盖过来,删除下一个结点。void DeleteNode(ListNode* posNode){ if(posNode) { ListNode* pNext = posNode->Next; p

2017-07-18 00:49:38 338

原创 链表--复杂链表的复制

一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。 typedef struct ComplexNode{ DataType _data ; // 数据 struct ComplexNode * _next; // 指向下一个节点的指针 struct ComplexNode

2017-07-18 00:20:15 356

原创 根据面试题谈fork

先看fork 返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1。fork有以下几个特点: 1.子进程是父进程的副本。子进程获得父进程数据空间、堆和栈的副本(主要是数据结构的副本)。 2.父子进程不共享这些存储空间。父子进程共享正文端。 3.子进程对变量所作的改变并不影响父进程中该变量的值。 4.标准I/O是缓冲的,如果标准输出到终端设备,则它是行缓冲,否则它是全缓冲。 当

2017-07-17 21:55:54 362

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

判断链表链表是否带环: 思路:给两个指针一快一慢,快的一次走两步,慢的一次走一步,如果两个指针最后相遇,则说明带环。 如果快指针到NULL,则说明没有环。ListNode* IsHaveCircle(ListNode* pHead){ assert(pHead); ListNode* pFast = pHead; ListNode* pSlow = pHead;

2017-07-17 09:15:13 287

原创 链表--查找单链表的倒数第k个节点,要求只能遍历一次链表

ListNode* FindKNode(ListNode* pHead,int k){ if(k<=0 || pHead ==NULL ) return NULL; ListNode* pFast = pHead; ListNode* pSlow = pHead; while(k!=0 && pFast != NULL) {

2017-07-16 21:50:12 538

原创 链表--逆置/反转单链表

ListNode* Reverse(ListNode* pHead){ ListNode* pNewHead = NULL; ListNode* pPre = NULL; ListNode* pCur = pHead; while(pCur != NULL) { ListNode* pNext = pCur->Next;

2017-07-16 21:49:15 357

原创 链表--合并两个有序链表,合并以后的链表依旧有序。

递归://递归ListNode* MergeList(ListNode* pHead1,ListNode* pHead2){ if(pHead1 == NULL) return pHead2; else if(pHead2 == NULL) return pHead1; //新链表的头 ListNode* pNewHea

2017-07-16 21:47:31 380

原创 链表--1.判断两个链表是否相交,若相交,求交点。(假设链表不带环)2.判断两个链表是否相交,若相交,求交点。(假设链表可能带环)

1.判断两个链表是否相交,若相交,求交点。(假设链表不带环)1.若链表不带环 则若相交只有一种方式。 方法一: 把List2链接到List1的后面,再遍历List2,如果List2有环则说明相交。且List2的头一定在环上。 方法二: 将List1与List2同时走到链表结尾,如果尾结点相同,则一定有环。 判断相交点:两个链表不一定一样长,所以先算出List1与List2的长度。

2017-07-16 21:45:26 437

原创 类--设计一个类不能被继承&&设计一个类只能在堆上创建对象&&设计一个类只能在栈上创建对象。

1.设计一个类不能被继承解法一:将构造函数设为私有函数 在C++中,子类的构造函数会自动调用父类的构造函数,子类的析构函数也会调用父类的析构函数。要想一个类不能被继承,只要把它的构造函数和析构函数都设置为私有函数。那么当一个类试图从那里继承时,势必会因为调用构造函数和析构函数而导致编译错误。 可是这个类型的构造函数和析构函数都是私有函数,我们怎样才能得到该类型的实例呢?我们可以通过定义共有的静态

2017-07-16 19:46:36 408

原创 算法--两种方法实现一个Add函数,让两个整数相加,但是不能使用+、-、*、/等四则运算符。

方法一:(网上都解释的很好 这里就不赘述了)int Add1(int num1,int num2){ int sum, carry; do { //因为位运算加法,0+1=1,1+0=1,0+0=0,1+1=0(但是要进位),所以跟异或有点类似 //但是当num1&num2的时候,当为一的时候需要左移一位,表示进位。 sum

2017-07-14 10:33:21 5628

原创 算法--实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。(详细讲解)

做题的时候发现了这道题。苦苦深思不得其解。在网上看到答案被其神奇之处震惊,所以特此研究并且详解。方法一:利用构造函数和静态数据成员 此方法主要实在类中添加构造函数,及一些相关静态函数。 上图: 方法一:class Add{public: Add() { ++num; sum += num; } //重置,将num与sum清

2017-07-13 17:37:09 1125

转载 HTTP协议详解

引言HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。HTTP协议的主要特点可概括如下: 1.支持客户/服务器模式。

2017-07-12 15:25:16 631

http-tools(这个版本的ab有坑)

这是centos6.5 内核版本为2.6.32-431.el6.i686 自带的http-tools。其中ab有坑,慎用。

2019-04-30

vld内存泄漏检测工具下载

VLD是一款用于Visual C++的免费的内存泄露检测工具。他的特点有:可以得到内存泄漏点的调用堆栈,如果可以的话,还可以得到其所在文件及行号; 可以得到泄露内存的完整数据; 可以设置内存泄露报告的级别;

2017-07-03

空空如也

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

TA关注的人

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