自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(37)
  • 收藏
  • 关注

原创 AVL树

一、AVL树简介(1)AVL树又称为高度平衡的二叉搜索树,是1962年有俄罗斯的数学家G.M.Adel’son-Vel’skii和E.M.Landis提出来的。 它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度;(2)AVL树是既满足二叉搜索树的性质,同时又满足平衡树的性质(左右子树的高度差不超过1)(3)AVL树的性质: 1>左子树和右子树的高度之差的绝对值不超过1 2>

2017-07-31 02:07:17 467

原创 二叉搜索树(BST树)

一、简介(1)二叉搜索树,又叫做二叉排序树,二叉查找树,有序二叉树 是指一棵空树或者具有下列性质的二叉树:每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。左子树上所有节点的关键码(key)都小于根节点的关键码(key)。右子树上所有节点的关键码(key)都大于根节点的关键码(key)。左右子树都是二叉搜索树。(2)二叉搜索树中序遍历的结果就是一个升序序列;(3)

2017-07-30 03:01:35 371

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

1.【基础题】–判断一个节点是否在一棵二叉树中(注意多测几个节点,看是否都能找到)bool _Find(Node* root,const T x)//判断一个节点是否在一棵二叉树中 { //1.如果树为空,返回空指针 if (root==NULL) { return false; } /

2017-07-28 16:47:42 835 1

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

1.【基础题】–判断一棵树是否是完全二叉树。提示:层序遍历变型题。(1)基础知识 【二叉树】:二叉树是一棵特殊的树,二叉树每个节点最多有两个孩子结点,分别称为左孩子和右孩子。【满二叉树】:高度为N的满二叉树有2^N- 1个节点的二叉树。【完全二叉树】: 若设二叉树的深度为h,除第h 层外,其它各层(1~h-1) 的结点数都达到最大个数,第h 层所有的结点都连续集中在最左边,这就是完全二叉树 【

2017-07-28 01:02:03 25388 8

原创 链表翻转【比如链表1→2→3→4→5→6,k=2, 翻转后2→1→4→3→6→】

2.【附加题】–1、链表翻转,给出一个链表和一个数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, 用程序实现Node* RotateList(Node* list, size_t k). 提示:这个题是链表逆置的升级变型。#include<iostream>using namespac

2017-07-25 21:39:28 1307

原创 求一个二叉树的镜像/在二叉树中查找某个元素X

1.二叉树镜像 void _MirrorTree(Node* root) { //1.空树,直接返回 if (root==NULL) { return ; } //2.树只有一个结点,不用求镜像,直接返回 if(root->left==NULL&&root->rig

2017-07-25 00:40:59 1404

原创 在一个从左到右从上到下都是递增的m*n的矩阵中找一个数x

2.【附加题】–一个m*n的矩阵,从左到右从上到下都是递增的,给一个数x,判断x是否在矩阵中。要求效率尽可能的高。 #include<iostream>#include<cassert>using namespace std;bool Find(int* arr,int row,int col, int x){ if (arr==NULL) { return

2017-07-25 00:38:35 923

原创 二叉树前序,中序,后序的遍历【递归(借用栈实现)和非递归】

#include<iostream>#include<cassert>#include<stack>using namespace std;template<class T>struct TreeNode{ T data; TreeNode<T>* left; TreeNode<T>* right; TreeNode(const T& x)

2017-07-25 00:36:21 419

原创 求二叉树的高度/销毁一颗二叉树【递归思想】

#include<iostream>#include<cassert>using namespace std;template<class T>struct TreeNode{ T data; TreeNode<T>* left; TreeNode<T>* right; TreeNode(const T& x) :data(x)

2017-07-24 03:04:41 1221

原创 求二叉树叶子节点的个数/求二叉树第k层的节点个数(递归思想)

//1.【基础题】--求二叉树叶子节点的个数/求二叉树第k层的节点个数。 #include<iostream>#include<cassert>using namespace std;template<typename T>struct TreeNode{ T data; TreeNode<T>* left; TreeNode<T>* right; Tr

2017-07-23 02:10:57 999

原创 计算机端口详解

IP地址+网络号:标志因特网上一个唯一的进程一、什么是端口:端口是计算机与外界通讯交流的出口。联网的计算机间要相互通信就必须具有同一种协议。协议就是计算机通信的语言,Internet的通用语言是TCP/IP(是一组协议),它规定在网络的第四层——运输层有两种协议TCP、UDP。端口就是为这两个协议打开的通道。其中硬件领域的端口又称接口。软件领域的端口一般指网络中面向连接服务和无连接服务的通信协议端

2017-07-22 19:55:25 774 1

原创 求整数N阶乘N!末尾有多少个0呢?

一、采用常规的做法,求出N的阶乘,然后计算出该结果末尾的0的个数; 这种方法有两个缺陷: (1)无论将结果定义为long还是double,结果值都会溢出; (2)效率低下;方法一: 那么我们分析,N!中能产生末尾是0的质数组合是2*5;所以N!的结果末尾0的个数;取决于2的个数X和5的个数Y的最小值;因所以M=min(X,Y);又因为能被2整除的数出现的频率比能被5整除的数高得多,且出现一个

2017-07-22 14:48:09 3723

原创 二叉树的层序遍历(非递归,借用队列实现)

1.【基础题】–实现一颗二叉树的层序遍历。 #include<cassert>#include<queue>using namespace std;template<class T>struct TreeNode{ T data; TreeNode* left; TreeNode* right; TreeNode(const T& x=T())

2017-07-21 19:50:46 1008

原创 非比较排序---【归并排序】

一、归并排序的思想 归并排序利用了分冶的思想,将一块待排序的区间,取中间位置,分成两段区间;然后通过不断的递归,直到每段区间只有一个数字,这时我们就认为该段区间有序,然后将这相邻的两段有序区间合并为一个有序区间; 这样通过递归先分裂数组,然后再合并数组,就完成了归并排序; 二、代码实现#include<iostream>#include<cassert>using namespace s

2017-07-21 17:04:25 332

原创 元素出栈、入栈顺序的合法性。

1.【基础题】–元素出栈、入栈顺序的合法性。 如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),则合法。 入栈的序列(1,2,3,4,5),出栈序列为(4,5,2,3,1),则不合法。 #include<iostream>#include<cassert>#include<stack>using namespace std;//Input为入栈序列,output为出

2017-07-20 20:00:20 376

原创 寻找一个字符串中第一个只出现两次的字符

2.【附加题】–查找一个字符串中第一个只出现两次的字符。 比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1) 解法: 利用哈希表;由于ASCII表中一共存在256个字符;所以开辟一个256大小整型数组;将这个数组看做哈希表,将字符的ASCII值当做Key值作为数组下标,将key对应的数组元素的值作为value,先遍历一遍字符串,统计

2017-07-20 17:52:58 1145 2

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

1.【基础题】–1.实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1) 解法:定义两个栈成员变量_s1和_s2, _s1作为主栈,存放该栈的元素; _s2作为副栈,其中_s2的栈顶元素,记录主栈_s1当前所有元素中的最小值; 每当_S1中的元素出栈时,都要和_s2的元素做对比,如果_s1当前出栈的元素就是其当前_s1所有元素的最小值

2017-07-20 11:15:35 886

原创 字符串空格替换

【附加题】--替换字符串中的空格为$$$。要求时间复杂度为O(N) 例如:将"talk is cheap show me the code"替换。为"talk$$$is$$$cheap$$$show$$$me$$$the$$$code"。解题思路: 1.先求出原字符串中空格的个数NumBerOfBlank; 2.求出源字符串的的字符个数(不含‘\0’)OldLength; 3.求出加上替换

2017-07-20 07:33:14 364

原创 两个队列实现一个栈 / 两个栈实现一个队列

一、认识栈和队列 C++ Stacks(堆栈) C++ Stack(堆栈)——是说实现了一个先进后出(FILO)的数据结构。 操作 比较和分配堆栈 empty() 堆栈为空则返回真 pop() 移除栈顶元素 push() 在栈顶增加元素 size() 返回栈中元素数目 top() 返回栈顶元素 C++ Queues(队列) C++队列是一种容器适配器,它给予程序员一种先

2017-07-19 17:42:08 308

原创 一个关于fork()的面试题

2.【附加题】–请问下面的程序一共输出多少个“-”? #include #include #include int main(void) { int i; for(i=0; i<2; i++){ fork(); printf("-"); } return 0; }解析: 因为printf输出是带缓存机制的,属于行缓存;当不刷新缓冲区或者没有遇到换行符之前;printf

2017-07-17 01:39:40 342

原创 C语言编程中的缓冲区

下面介绍缓冲区的知识。一、什么是缓冲区  缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据, 这部分预留的空间就叫做缓冲区。  缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。二、为什么要引入缓冲区  我们为什么要引入缓冲区呢?  比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区

2017-07-16 20:29:00 931

原创 求两个链表的相交点(含链表带环情况)

1.【基础题】 1.判断两个链表是否相交,若相交,求交点。(假设链表不带环) 2.判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】 //#include<iostream>#include<assert.h>using namespace std;struct Node{ int data;; Node* next; Node(const i

2017-07-16 18:18:22 833

原创 链表是否带环/求环的长度/求环的入口点

#include<iostream>#include<assert.h>using namespace std;struct Node{ int data; Node* next; Node(const int x) :data(x) ,next(NULL) {}};----------**************************

2017-07-16 01:23:37 405

原创 C语言中volatile关键字的作用

本文转自:http://blog.csdn.net/chuckfql/article/details/7445476 作者:chuckfql一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执

2017-07-15 18:54:57 217

原创 实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字

//2.【附加题】--实现1+2+3...+n;//要求不能使用乘除法、for、while、if、else、switch、case 等关键字;//(这个题有多种解法,大家可以尽量去思考,这个题最优的解法时间复杂度是O(1),大家可以去尝试实现) #include<iostream>using namespace std;----------//方法一:使用条件判断语句(三目运算符 ?:)

2017-07-15 16:08:24 1293

原创 【冒泡排序】

一、简介 冒泡排序时交换排序的一种; 它的总体思想是:从数列的第一个数开始,将数列的数字两两比较,使得大数在前,直到倒数第二个数和倒数第一个数作比较,然后使得大数在前;那么这一趟比较下来,就会把数列中最大的数冒泡到数列的最后面;下一趟冒泡只需要冒泡到倒数第二个,依次类推,直到某趟冒泡的元素剩下一个;冒泡完毕,排序完成 (1)普通写法 假设一个数组中有sz个元素,每趟冒泡会把1个元素放在正确的

2017-07-14 22:21:02 316

原创 单链表排序问题(冒泡/快排【前后指针法】)

#include<iostream>#include<assert.h>using namespace std;typedef struct Node{ int data; struct Node* next; Node(int x) :data(x) ,next(NULL) {}}Node;----------//核心代码

2017-07-14 17:45:18 851

原创 不使用加减乘除计算数字相加问题

1.实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、–等等 #include<iostream>using namespace std;int Add(int a,int b){ //递归返回条件 if (a==0) return b; if (b==0) return a; int

2017-07-14 15:19:59 637

原创 合并两个有序链表/链表反转(逆置)/找链表倒数第k点(遍历一次)

//1.【基础题】--合并两个有序链表,合并以后的链表依旧有序。 #include<iostream>using namespace std;typedef struct Node{ int data; struct Node* next; Node(int x) :data(x) ,next(NULL) {}}Node;No

2017-07-14 02:50:26 346

原创 string传统/现代写法

//传统写法#include<iostream>#include<cstring>using namespace std;class String{public: String(const char* str)//构造 :_str(new char[strlen(str)+1]) { cout<<"构造"<<endl; s

2017-07-14 00:56:27 626

原创 【选择排序】和【堆排序】

一、选择排序(1)选择排序的算法思路(假设升序) 每次从待排序的区间中找到一个最小数,然后将这个最小数和该区间的第一个数交换数值;然后缩小区间,继续这样的的方法,最终到该待排区间为一个数时停止,排序完成;总体算法分三步完成:选数据—>将所选数据放入合适位置—>缩小需要排序的范围(2)图说 (3)程序#include<iostream>#include<assert.h>using nam

2017-07-13 18:57:47 263

原创 【直接插入排序】和【希尔排序】

一、直接插入排序(1)算法步骤(升序)1>将待排序数组的第一个数拿出来看做一个已经排序好的有序区间;将后面的数列看做一个无序的待排序数列; 2>从有序数列的最后一个数开始和待排序数列的第一个数key比较(即有序数列的最后一个位置的下一个位置的数),如果有序数列的最后一个数大于key,则将有序数列的最后一个数填到key的位置;然后取有序数列的前一个数和key比较,大于key则填入后一个位置,继续取有

2017-07-13 16:23:45 519

原创 【快速排序】★★★★★

一、快速排序的简介快速排序是一种总体上来讲时间复杂度较低的排序,其主要利用了分冶的思想;在排序一大段数据时,每次通过选取key值,然后利用不同的方法将该段数据分为两段(小于等于key的一段在一边,大于key的一段在一边,key的数据在这两段的中间);然后通过递归的方法分别对上述的左右两段数据采用同样的思想分段;快速排序每一趟下来,位于两段中间的key值就会被置于最终排序时该数据的正确位置,就是说快速

2017-07-12 02:33:04 3247 1

原创 模板实现动态顺序表(含容量检测函数的详细讲解)

一、模板实现动态顺序表 (1)要实现的成员函数和成员变量template<typename T>class SeqList{public: SeqList();//构造 SeqList(const T& seqlist);//拷贝构造 SeqList& operator=(const T& seqlist);//赋值运算符重载 ~SeqList();//析构

2017-07-11 01:30:10 480 1

原创 几个链表面试体(从尾逆序打印,删除某个位置,赋值复杂链表)

一、程序#include<iostream>#include<stack>using namespace std;typedef struct Node{ int data;; Node* next; Node(int x) :data(x) ,next(NULL) {}}Node;typedef struct Complex

2017-07-10 21:16:07 265

原创 结构体内存大小的求法(内存对齐)&&c++类大小同样适用

一、内存对其的原因:1. 平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取特定类型的数据,否则抛出异常; 2. 性能问题:数据结构(尤其是栈)应该尽可能的在自然边界上对齐;员应在于,为了访问没有对齐的内存数据。处理器需要作两次内存访问;而对于对齐的内存处理器只需访问一次内存,就可以获得正确的数据; (以空间换区时间)二、结构体内存对齐规则:结构体的

2017-07-09 22:45:44 394

原创 定义一个只能在堆上生成对象的类&&定义一个只能在栈上生成对象的类&&定义一个类不能被继承

1.定义一个类不能被继承子类在继承父类的成员函数和成员变量之后,在子类的构造函数之前会先调用父类的构造函数,先初始化父类的成员变量,然后在子类的构造函数中初始化子类的成员变量; 所以一个类不能被继承,表示其子类在实例化对象时不成功,即不能调用父类的构造函数;那么将父类的构造函数的访问属性设置成为私有,这样一来,不论采用任何继承关系,父类的私有成员在子类中都不可见;即父类的构造函数在子类的构造函数之

2017-07-07 15:35:52 512

空空如也

空空如也

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

TA关注的人

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