自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 以后就把这个博客当作记笔记的地方了.................割割割割割割割割割割割割割割割割割割

割割割割割割割割割割割割

2018-06-15 10:47:51 350

原创 面试->面试题

1.请说出static 和 const关键字尽可能多的作用:static关键字至少有下列n个作用:   1. 函数体内static变量的作用范围为该函数体(变量作用域),链接属性为空链接,生命周期为随程序(静态局部变量),不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; 2. 在模块内的static全局变量可以被模块内所用函数访问(作用域),但不能

2017-09-22 18:10:14 948 1

原创 面试->代码

一.剑指offer代码鲁棒性(输入参数检查等)贯穿所有代码当中,不会特别强调. 1.赋值运算符函数注意:1.返回值类型为该类型引用(链式赋值),返回*this2.传入参数常量引用3.释放自身已有空间4.判断是不是自身赋值例:MyString& MyString::operator=( const MyString& str ){ if (

2017-09-19 15:31:29 908

原创 一个小项目 --- C++实现内存泄漏检查器

思路:1.内存泄露产生于 new/new[] 操作进行后没有执行 delete/delete[]2.最先被创建的对象, 其析构函数是最后执行的解决方法:1.重载operator new/new[ ] 与 operator delete/delete[ ], 并借助双向链表结构我们自己手动管理内存2.创建一个静态对象, 在程序退出时才调用这个静态对象的析构函数( 在析构函数中,

2017-08-17 00:27:53 5080 9

原创 计算器(版本1)

最简单最原始最烂最垃圾的计算器版本:1.每次只能计算一步2.连续计算,即计算完一步后只能在计算结果上继续计算,无法将程序归03.更不用说 逆波兰表达式的应用4.鲁棒性也很差啊啊啊,  除0这种错误也未检查不过呢,因为这次不是在win32控制台下实现(如果控制台里实现这个版本也太太太low了吧),而是使用了MFC,相当于第一次接触MFC与界面化,所以呢,这个很low的计算

2017-08-11 22:18:34 480

原创 删除链表中重复的结点

ListNode* deleteDuplication(ListNode* pHead) { if ( NULL == pHead || NULL == pHead->next ) return pHead; ListNode* p1 = pHead; ListNode* p2 = pHead->ne

2017-08-01 20:39:19 1045

原创 判断单链表是否带环,如果带环,求环的长度和入口结点

//首先判断单链表是否带环(我有一篇博客已经写过),若带环(此时快慢指针已经相遇),从此刻起计步,直到下次两个指针再相遇,快指针步数减去慢指针步数,即为环的长度//得到环的长度后如图,即可求得入口结点 ListNode* EntryNodeOfLoop(ListNode* pHead) { if ( NULL == pHead ) re

2017-07-22 23:04:04 1143 3

原创 n个2*1小矩形无重叠覆盖2*n大矩形(递归,思路分析及代码实现,斐波那契数列衍生)

//我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?//思路:  对于n>=3的情况, 不管前面矩形是怎样覆盖的。我们只考虑最后一次怎么覆盖。//最后一次只有两种覆盖方式:1.用1个小矩形竖着覆盖。   2.用两个小矩形横着覆盖。//所以总的方法数无外乎   -->  你用各种方法覆盖到只剩1个再竖

2017-07-21 22:29:33 2104

原创 青蛙跳台阶衍生之变态跳台阶(递归,思路分析及代码实现)

//一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。//思路: 接上一个跳台阶问题思路继续分析,上个问题中,青蛙只能跳1级或者2级。 则最后一跳只有两种可能,所以F(n) = F(n-1) + F(n-2)//现在青蛙可以跳n级。 假设台阶为n级,则青蛙可以 跳一次或者多次。 一次: 直接跳n级,这是一种方法。 多次:

2017-07-21 00:18:49 3203 3

原创 斐波那契数列衍生之 求青蛙跳上n级台阶的 跳法数(递归)

//一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法// n = 1, 1种方法(一次1级台阶)// n = 2, 2( 两次1级, 或者一次2级 )//前两种为基准情况// n = 3, 3( 三次1级, 或一次1级一次2级(顺序不同,两个方法) )// n = 4, 5( 四次1级, 或两次二级, 或两次一级一次两级(顺序不同,三种方法) )

2017-07-19 17:46:56 1268 2

原创 合并两个有序的链表使新链表依然有序(不开辟新空间,在原链表上操作。 递归版本)

//递归ListNode* Merge( ListNode* pHead1, ListNoe* pHead2 ){ if ( NULL == pHead1 ) return pHead2; else if ( NULL == pHead2 ) return pHead1; ListNode* pMergedHead = NULL; if ( pHead1->val val

2017-07-18 23:53:43 1071 1

原创 合并两个排序的链表使之依然有序(不开辟新空间在原链表上操作的非递归版本)

ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if ( NULL ==pHead1 ) return pHead2; else if ( NULL == pHead2 ) return pHead1; ListNod

2017-07-12 21:54:01 1826 6

原创 不开辟新空间反转单链表(递归版本)

写的还是很坑的,今天状态奇差ListNode* ReverseList(ListNode* pHead, ListNode*& pNewHead ){ if ( NULL == pHead ) return NULL; ListNode* pPrev = NULL; if ( NULL != pHead->m_pNext ) pPrev = ReverseList( pHe

2017-07-09 17:52:52 997

原创 反转链表(在原链表进行操作,不开辟新空间. O(N)

//定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。ListNode* ReverseList(ListNode* pHead) { if ( NULL == pHead || NULL == pHead->next )//链表为空和链表只有一个结点在这个语句进行处理 return pHead; ListNode* pPrev = NULL; ListNo

2017-07-08 22:23:48 1685

原创 判断单链表是否带环

//这个题思路不难,我们只要定义两个指针,一快一慢,快指针一次走两步,慢指针一次走一步//如果它们相遇,则单链表构成了环形结构。 如果未相遇, 而快指针走到了链表结尾,则单链表未构成环形结构#include using namespace std;struct ListNode{ int m_nKey; ListNode* m_pNext; ListNode( ListNode

2017-07-08 21:34:07 767

原创 只遍历链表一次求链表中间结点

ListNode* MidNode( ListNode* pHead ){ if ( NULL == pHead ) return NULL; else if ( NULL == pHead->m_pNext ) return pHead; else if ( NULL == pHead->m_pNext->m_pNext ) return pHead; ListNode*

2017-07-08 17:09:13 903

原创 寻找链表中倒数第k个结点

//1.相当于遍历链表两次,第一次结点指针全部入栈,第二次找到倒数第k个结点ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { //注意防御性编程: //1.如果k大于链表的个数. //2.如果k为0 //3.如果链表为空 if ( NULL == pListHead || 0 == k ) return

2017-07-08 15:01:24 637

原创 从尾到头打印链表

struct ListNode{ int m_nKey; ListNode* m_pNext; ListNode( ListNode* pNext, int value ) : m_pNext( pNext ) , m_nKey( value ) {}};递归版本:void printListFromTailToHead(ListNode* head)

2017-07-07 15:15:16 438

原创 斐波那契数列递归解法与循环解法

写一个函数,输入n,求斐波那契数列的第n项。递归解法(效率很低):int Fibonacci(int n){ if ( 0 == n ) return 0; else if ( 1 == n ) return 1; else return Fibonacci(n-1) + Fibonacci(n-2);}循环解法(O(n)):long long Fib

2017-07-06 22:25:04 898 2

原创 在O(1)时间删除链表某一节点

给定单链表头节点和一个结点指针,在O(1)时间删除该结点。struct ListNode{int m_nValue;ListNode* m_pNext;};void DeleteNode( ListNode** pListHead, ListNode* pToBeDeleted ){//1.链表为空(指针为NULL,但是它的地址不为0)(指针的地址得

2017-07-04 18:45:01 744 4

原创 求一颗不含指向父节点指针的普通树中任意两个结点的最近公共祖先(O(N*N) 和 O(N) 算法)

//方法1 来自剑指offer//#include //#include //#include //using namespace std;//#include "BinaryTree.h"//////template //bool GetNodePath( BinaryTreeNode* pRoot, BinaryTreeNode* pNode1, list*>& path )

2017-06-29 15:51:28 877

原创 求二叉树中最远的两个节点间的距离

//后序 求 每个节点最远距离, 倒着遍历, 只遍历了一遍 O( N )//如果从上往下遍历 则 O( N*N )int GetMaxPathLen( Node* root, int& maxLen ) //maxLen初始值传0{ //别用 全局变量(存在线程安全问题) if ( NULL == root ) return 0; int left = GetMaxPathLe

2017-06-29 11:10:23 1586

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

4.判断一颗二叉树是否是完全二叉树思路: 完全二叉树定义:完全二叉树:只有最下面的一层结点度能够小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树我们根据二叉树性质, 在下一层结点满的情况下,结点数是上一层结点数二倍  -->利用两个队列, 队列1保存上层结点, 队列2保存下层结点(由队列1中结点得到)我们先将 根节点入队列 1, 利用一个变量来保存 队列1 中 结点

2017-06-28 15:48:29 1508

原创 模拟实现STL-Vector

vector: resize( )/reserve() 与 capacity/size 关系:#include #include using namespace std;//capacity 变化规律void TestVector( ){ vector v1; v1.push_back( 1 ); cout << v1.capacity( ) << endl;// 1

2017-05-31 17:12:33 555

原创 STL--> list 双向循环链表容器 接口使用及介绍。 模拟实现 STL list容器

使用STL vector 接口:#include #include using namespace std;void TestVector( ){ vector v1; v1.push_back( 1 ); v1.push_back( 2 ); v1.push_back( 3 ); v1.push_back( 4 ); PrintVector( v1

2017-05-29 23:26:31 1966 1

原创 剖析智能指针

首先我们来看一段代码:  如:int* p1 = new int(2);bool isEnd = true;......if ( true == isEnd ){ return;}......delete p1;我们在堆上 new 出空间后, 本来应该在下面 delete 掉我们开辟的空间 ,但中间, 因为条件满足, 我们 return 了 ,

2017-05-26 14:15:48 258

原创 求树中两个节点的最近公共祖先(版本2)

1.求树中两个节点的最近公共祖先(版本2) 我们来看 这个问题 的 第二种解析思路在第一种思路中, 我们将 这个题意理解为,这棵树是一颗二叉搜索树.在第二种思路中, 我们将 这棵树, 理解为一颗普通的树, 或许它都不是二叉树, 不过这不重要(不过为了方便测试, 我们将用结点中含有指向父节点指针的二叉树进行测试  ---> 不过 ,这与用普同一棵树进行测试并没有本质的区别 )在这次分

2017-05-17 15:59:28 2023

原创 求两个链表的第一个公共结点各种情况及三种思路分析

1.寻找两个链表的第一个公共结//这道题可以有很多种思路, 我们按照, 有坏到好的顺序, 来依次介绍每种思路。  同时, 这种顺序,   也是我们面对这道题时,能想到的 由易到难的思路第一种思路:蛮力法:  简单粗暴, 蛮力法。  假设有两个链表 L1 与 L2.  我们拿出 L1 的第一个结点, 在 L2 中依次遍历一遍, 遇到数值相同结点, 则返回。    否则 , 拿出 L1 中第二个结

2017-05-17 13:32:41 1237

原创 树中两个节点的最近公共祖先 多种情况分析

1.求树中两个节点的最近公共祖先这个问题按 对题意解析思路 的不同, 可以有许多的变种问题 和 解决思路首先我们来看比较简单的一种: 如果这颗树是 二叉搜索树( 假设这个二叉搜索树中没有两个值相同的结点, 并且我们 考虑的这两个结点不是空结点 )根据二叉搜索树的性质( 左子树的值都比根节点小, 右子树的值都比根节点大 )我们的思路为: 从根节点开始, 如果两个节点的值 都比当前节点

2017-05-16 00:12:00 963

原创 栈 入栈序列与出栈序列 合法性 的一个有趣问题

4.输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。 假设压入栈的所有数字均不想等。 例如: 序列 1 2 3 4 5 是某栈的压栈序列, 序列 4 5 3 2 1是该压栈序列对应的一个弹出序列, 但 4 3 5 1 2就不可能是该压栈序列的弹出序列。思路: 首先我们来 理解下题意, 有些人可能会这么想, 1 2 3 4 5为压栈序列, 弹出序列

2017-05-15 17:59:31 1050

原创 实现一个栈, 其 Push,Pop,Min 操作的 时间复杂度 均为 O( 1 )

1.实现一个栈, 要求 : Push, Pop, Min 操作的 时间复杂度 均为 O( 1 ).思路: 首先, 我们先否定一种思路: 用一个变量保存每次入栈后 栈中最小值, 这种思路的问题在于, 第一次返回最小值是正确的, 可是这个最小值被 Pop 掉后, 次小值如何获得呢.接着 我想到了 ,用数组保存 每个元素, 每次元素入栈时进行比较 , 按降序 排序, 后来发现这种思路 既麻烦又没有必要

2017-05-12 15:44:26 823

原创 利用两个队列实现栈---进栈和出栈

根据两个队列实现一个栈,    大致思路与我上篇博客 ---> 根据两个栈实现一个队列  类似所以直接贴出代码://两个队列实现一个栈, 思路 与 两个栈实现一个队列基本类似(我发过博客)#include #include using namespace std;template class MyStack{public: MyStack( ) {}

2017-05-09 15:19:42 691

原创 利用两个栈实现队列的--->基本操作

面试题:使用两个栈实现一个队列 栈和队列都是我们经常使用的数据结构, 栈 -> 后进先出,  队列  ->  先进先出   何其相似, 既然如此, 我们可不可以  试着 用 两个栈来试试实现一个队列呢基本思想:我们使用两个栈, s1:实现入队,s2:实现出队 首先,将数据存放在栈s1中,然后将数据push进s2中,再将s2中的数据pop   出队列:  (1)如果栈B不

2017-05-09 00:20:11 909 3

原创 给出前序与中序 序列 重建二叉树

面试题: 给出一个前序序列 和 中序序列 重建出这颗二叉树思路:  通过前序序列, 我们可以找到这颗二叉树的 根, 找到根后 通过中序遍历序列, 我们可以找出 这个根的 左子树 和 右子树 序列。有了这层思路, 我们就可以 通过递归的方式分别去 构建 根 根的左子树,  根的右子树如 给出:int preorderSequence[] = { 1, 2, 4

2017-05-08 19:09:29 409

原创 二叉搜索树转换为双向链表

这是一道面试题,将 二叉搜索树  ->  排序双向链表, 虽然是一道面试题, 不过也给我们提供了一种思路, 二叉搜索树和双向链表这两种我们常用的数据结构, 他们之间可以进行互相转换吗?  倒也是一个值得玩味的想法。思路:根据 二叉搜索树 的性质,要转换为 有序双向链表, 则, 中序遍历最适合。  因为中序遍历出来是有序的,由小到大。二叉搜索树每个节点有两个指针分别指向左右两个孩子, 双

2017-05-08 18:44:16 496

原创 一个数组实现两个栈

一道面试题:一个数组实现两个栈通常我们实现栈有 数组 和 链式 两种结构。 但数组形式一般用来实现一个栈,  现在我们如何用一个数组 来实现 两个栈保存数据呢。一般来说,有三种思路: 1. 将数组的下标为0的位置当做第一个栈的栈底,下标为1的位置当做第二个栈的栈底,将数组的偶数位置看做第一个栈的存储空间,奇数位置看做第二个栈的存储空间。  如图:2.从数

2017-05-08 18:21:21 1444 2

原创 类型萃取

类型萃取:  区分T是什么类型。(因为有时候内置类型和自定义类型执行的代码可能不同(比如内置类型的代码,自定义类型不可用.自定义类型的代码,内置和自定义类型都可以用这时我们不可能为每种类型专门特化出来一个版本去写代码,  或者两种类型都使用自定义类型的代码。  如果我们能:区分T的类型,让自定义类型执行自定义类型代码,让内置类型,执行内置类型代码。  那么情况就会好很多。  因此我们提出了类型

2017-04-21 12:19:58 661 1

原创 c++模板

假设我们有如下 比较 Funbool IsEqual (const int& left , const int& right)  {return left == right;} 此时我们比较 int 值是否相等->函数调用->    isEqual( 1, 2 );但如果我们想比较 两个 string 对象是否相等, 则需要重新写一个Fun:bool IsEqual

2017-04-21 11:17:21 577

原创 红黑树(RedBlackTree)实现

红黑树(Red Black Tree) 是一种自平衡二叉查找树,和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。但现实中 红黑树 的应用比 AVL 树多, 因为同时插入一个结点,AVL树旋转的时候,红黑树不一定旋转。我们通过上滤(自底向上调整)算法用c++模板类实现了红黑树的插入操作代码,但是,更好的实现插入操作的算法是下

2017-04-19 09:17:21 816

原创 c++模板类构建AVlL树及AVL树的单双旋转图文简述,以及插入新节点后如何通过旋转使之继续保持平衡

AVL树  可以将AVL树看作平衡二叉搜索树, 因为原始二叉搜索树极端情况下效率不高,如只有一条单链,此时和链表相当因此出现了这一古老的树种,AVL树  :http://baike.baidu.com/link?url=YSwg_fEmV9l07F364_g9B3aBgf2uRaa8fpG8zmXrMCPasdON523B6zJKelC8fddrF9p2QQ-JjYhD2g9l7D-s

2017-04-06 16:55:55 3163

空空如也

空空如也

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

TA关注的人

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