C++
文章平均质量分 64
景亍
这个作者很懒,什么都没留下…
展开
-
关于c++ new操作符的重载
原文地址:http://blog.csdn.net/bichenggui/article/details/4823978关于c++ new操作符的重载你知道c++ 的new操作符和operator new的区别么?也许你还会问,他们有区别吗? 当你写下面这样的代码时,string *pa = new string("memory managerment");你使用的是n转载 2017-09-22 08:00:54 · 1068 阅读 · 0 评论 -
剑指offer 21---实现一个栈, 要求实现Push( 出栈) 、 Pop( 入栈) 、 Min( 返回最小值的操作) 的时间复杂度为O(1)
栈:先进后出实现方法:利用栈的性质,首先建立q1,q2两个栈,两个栈均为空。1.插入数据时,第一个数据在q1,q2中均插入。2.后面的数据依次插入q1中,每次插入一个数据后均和q2中的栈顶比较,如果此时数据大于s2的栈顶,则该数据不插入q2 中,如果此时数据小于或等于此时q2的栈顶,则将该数 据插入s2,依次进行。3.当所有数据入栈完毕后,s2的栈顶存储的即为该原创 2017-05-03 23:23:20 · 1213 阅读 · 3 评论 -
剑指offer 46---实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字
实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。//实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。#include #include using namespace std;int Sum(int k) { return k >0 ? k + Sum(k - 1) : 0;}int main(){原创 2017-07-14 16:32:43 · 371 阅读 · 0 评论 -
剑指offer 48---设计一个类不能被继承
设计一个类不能被继承在C++继承中,子类的构造函数会自动调用父类的构造,子类的析构会自动调用父类的析构。一个简单的例子:class AA{public: AA() { cout << "AA()" << endl; } ~AA() { cout << "~AA()" << endl; }};class BB:public AA{public: BB(原创 2017-07-17 13:27:51 · 634 阅读 · 0 评论 -
剑指offer 47----实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--
实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--#include #include using namespace std;int Add(int& num1, int& num2){ if (num1 == 0) { return num2; } if (num2 == 0) { return num1; }原创 2017-07-14 15:44:15 · 1318 阅读 · 5 评论 -
剑指offer 14---调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。原创 2017-08-02 17:27:25 · 438 阅读 · 0 评论 -
简洁版String实现
#include #include using namespace std;class String{public: String() :_data(new char[1]) { *_data = '\0'; cout << "String()" << endl; } String(const char* str) //构造 { int len = s原创 2017-04-18 14:56:35 · 630 阅读 · 0 评论 -
剑指offer 9---斐波那契数列
题目:写一个函数,输入n,求斐波那契数列的第n项。解1:递归实现斐波那契数列#include #include using namespace std;int Fibonacci(int n) //递归实现斐波那契数列{ if (n <= 0) { return 0; } if (n == 1) { return 1; }原创 2017-08-01 23:38:43 · 763 阅读 · 5 评论 -
C语言模式实现C++继承和多态
C语言模式实现C++继承和多态描述:C实现一个struct A和struct B各包含一个int成员a和b,要求达到B继承了A的效果,也就是B里面包含一个A。并且能达到多态的效果,也就是一个A*p指向A调的是A的函数,指向B调用的是B的函数。C++中的继承、多态继承是面向对象复用的重要手段。通过继承定义一个类,继承是类型之间的关系建模,共享公有的东西,实现各自本质原创 2017-08-01 22:06:13 · 1184 阅读 · 0 评论 -
剑指offer 38---数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数,例如输入排序数组{1,2,3,3,3,3,4,5};和数字3,由于3在数组中出现了4次,因此输出4.思路:时间复杂度: O(logn)空间复杂度: O(1)int FindFirstK(int* arr,原创 2017-08-08 14:40:03 · 632 阅读 · 0 评论 -
剑指offer27---将二叉搜索树转换成一个排序的双向链表
将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。定义: 二叉搜索树也叫二叉查找树或二叉排序树,它可以是一颗空树,或者是满足如下性质的二叉树:若该树的左子树不为空,则左子树上所有节点的值均小于根节点的值,若该树的右子树不为空,则右子树上所有节点的值均大于根节点的值。实现: 二叉搜索树具有二叉树的基本性质,有两个指针分别指向它的左右孩原创 2017-05-25 21:14:00 · 909 阅读 · 0 评论 -
求二叉树叶子节点的个数 && 求第K层的节点个数
求二叉树叶子节点的个数思路:1.如果根节点为NULL时,则是空树,返回0;2.根节点不为空时,如果根节点的左右子树均为空,则该二叉树中只有一个节点,即返回1;3.叶子节点的个数=左子树叶子节点数+右子树叶子节点数;int _GetNodeyezi(Node* root) //叶子节点的个数 { if (root == NULL) { return 0;原创 2017-07-23 20:11:02 · 1413 阅读 · 0 评论 -
剑指offer 39---求二叉树的深度 && 输入一颗二叉树的根节点,判断该树是不是平衡二叉树
求二叉树的深度递归求解/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: int TreeDe原创 2017-07-23 21:46:16 · 791 阅读 · 0 评论 -
剑指offer 19---二叉树的镜像
二叉树的镜像 :镜像即就是在镜子中所成的像代码实现:PS:搜索二叉树和普通二叉树实现方法是相同的,只是两种建树过程有所不同,此处实现的是搜索二叉树。1.递归实现:#pragma once#include #include #include using namespace std;template struct SearchBinaryTreeNode原创 2017-05-25 15:30:25 · 473 阅读 · 0 评论 -
快速排序
快速排序基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小,然后,依次按此方法分割排序,以此达到整个数据变成有序序列。时间复杂度: O(N*logN) (最坏情况为O(N^2),即为每次选取的key值均为最大或最小;最优情况为O(N*logN),因为对于快排来原创 2017-05-17 15:25:47 · 692 阅读 · 0 评论 -
剑指offer 40---数组中只出现一次的字符
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写出程序找出这两个只出现了一次的数字,要求时间复杂度为O(n),空间复杂度为O(1)。原创 2017-08-08 10:57:23 · 722 阅读 · 0 评论 -
销毁一颗二叉树-->Destroy(Node* root)
销毁一颗二叉树-->Destroy(Node* root)二叉树的很多问题都可用递归实现//销毁一颗二叉树-->Destroy(Node* root) void _Destory(Node* root) { if (root != NULL) { _Destory(root->_left); _Destory(root->_right); delete ro原创 2017-07-23 22:04:33 · 4804 阅读 · 0 评论 -
剑指offer 7---使用两个栈实现一个队列
栈:先进后出队列:先进先出首先构建栈q1,q2。入队列:入栈q1。出队列:首先将q1中的所有元素依次压入q2中,此时q1为空,q2中存放所有数据,在依次将q2中数据pop,即实现队列。代码实现如下:#include #include #include #include using namespace std;template class Queue{原创 2017-05-03 20:41:48 · 874 阅读 · 5 评论 -
剑指offer 7---使用两个队列实现一个栈
队列:先进先出栈:先进后出首先构建队列q1,q2。入栈:入队列q1。出栈:将q1队列中的前n-1个元素倒入到q2中,在pop q1中的第n个元素,即为要出栈的元素,下次,则对q2操作,每次保证有一个队列为空。栈顶:将q1中前n-1个元素倒入q2中之后,第n个元素即为栈顶。考虑到我们取栈顶元素的便利性,我们在实现时使得栈顶等于队列头;由于栈的pop弹出栈顶元素,而队列的p原创 2017-05-03 17:24:10 · 1156 阅读 · 1 评论 -
堆排序
堆排序定义: 堆排序是指利用heap这种数据结构所设计的一种排序算法,是选择排序的一种。可以利用数组的特点快速定位指定索引的元素,是完全二叉树。分类: 堆分为大堆和小堆,大堆要求每个节点的值均不大于其父节点的值,小堆要求每个节点的值均不小于其父节点的值。性能: 堆排序是不稳定的排序算法。(排序的稳定原创 2017-05-09 22:33:52 · 1413 阅读 · 3 评论 -
冒泡排序
冒泡排序算法原理: 冒泡排序是交换排序的一种,是一种较简单的排序算法,它重复的走访要排序的数组,一次比较两个元素,如果顺序错误就交换,直到没有要交换的,算法终止。步骤: 1.比较相邻元素,如果第一个比第二个大,就交换(从小到大排)。 2.对每一对相邻元素作同样工作,依次比较。 3.针对所有元素重复以上步骤,原创 2017-05-13 20:04:13 · 1113 阅读 · 0 评论 -
直接插入排序
直接插入排序: 直接插入排序是一种简单的插入排序,比较适合用于少量的数据排序。ps: 我在这里先实现的是直接插入排序,上述代码之后会一 一实现。基本思想: 把一组需要排序的数据逐个,依次插入到一个已经排好序的有序队列中,每次一个个插入,从最后开始, 依原创 2017-05-08 19:57:22 · 1012 阅读 · 0 评论 -
剑指offer 32---从1到n整数中1出现的次数
从1到n整数中1出现的次数原创 2017-08-06 09:25:59 · 264 阅读 · 0 评论 -
二分查找
二分查找:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后原创 2017-07-20 10:24:42 · 385 阅读 · 0 评论 -
文件压缩(哈夫曼树实现)
项目描述:项目简介:利用哈夫曼编码的方式对文件进行压缩,并且对压缩文件可以解压开发环境:windows vs2013项目概述: 1.压缩 a.读取文件,将每个字符,该字符出现的次数和权值构成哈夫曼树 b.哈夫曼树是利用小堆构成,字符出现次数少的节点指针存在堆顶,出现次数多的在堆底 c.每次取原创 2017-04-18 18:16:02 · 1777 阅读 · 0 评论 -
C++类中的继承
#include#includeusing namespace std;class Person{public: Person(const char* name = "abc") :_name(name) { cout << "Person()" << endl; } Person(const Person& pp) :_name(pp._name) {原创 2017-02-15 17:22:07 · 261 阅读 · 0 评论 -
bit_set(位图)
位图:位图就是bitset的缩写。所谓bitset,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来快速判断某个数是否存在。在STL中有一个bitset容器,其实就是位图法。位图法的优点:1.时间复杂度为O(1),可以快速判断数据是否存在。2.适用于处理大数据问题,节省空间。位图法的缺点:1.可读性差,每个bit只能存放1原创 2017-04-25 12:23:47 · 1701 阅读 · 1 评论 -
剑指offer 3---二维数组的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都是按照从上到下递增的顺序排序。请完成函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。代码实现: bool Find(int target, vector > array) { if(array.size()==0){ return 0原创 2017-08-19 18:31:12 · 749 阅读 · 1 评论 -
判断一个值是否在一棵二叉树中。(注意多测几个值,看是否都能找到)
判断一个节点是否在一棵二叉树中。(注意多测几个节点,看是否都能找到)思路:分别和二叉树中的每个结点值相比,找到返回true,找不到返回false//判断一个节点是否在一棵二叉树中。(注意多测几个节点,看是否都能找到) bool _IsExit(Node* root,T key) { if (root == NULL) { return false; } if原创 2017-07-27 11:20:37 · 1385 阅读 · 0 评论 -
实现二叉树的前序/中序/后序递归、非递归遍历
实现二叉树的前序/中序/后序非递归、递归遍历原创 2017-07-26 22:44:11 · 1201 阅读 · 0 评论 -
剑指offer 34---丑数
题目:求按从小到大的第1500个丑数。丑数:只包含因子2,3,5的数称为丑数。所谓一个数m是另一个数n的因子,是指n能被m整除。例: 解1:直观解法,从1开始计算,然后计数,直到第1500个丑数缺陷:每个整数都需要计算,效率非常低//判断是不是丑数bool IsUflyNum(int num){ if (num <= 0) { retu原创 2017-08-04 00:03:07 · 587 阅读 · 1 评论 -
求一个无序数组的中位数
求一个无序数组的中位数中位数是将数组排序之后,数组个数为奇数时,取中间的即为中位数;数组个数为偶数时,取中间两个的平均值即为中位数。思路一:要取得中位数,即给数组排序,使用任意排序算法均可,然后按数组下标取其中位数。PS:该方法很直观,此处不实现思路二:1.设数组元素为n个,且为奇数个时,取数组前(n+1)/2个元素建一个小堆2.遍历数组剩余元素,如果比堆顶原创 2017-08-03 17:33:07 · 9750 阅读 · 3 评论 -
归并排序
归并排序:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。步骤:1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列2.时间复杂度: O(N*lgN)空间复杂度: O(N) 需要额外空间性能: 稳定归并排序主要分原创 2017-08-03 12:50:15 · 466 阅读 · 0 评论 -
剑指offer 5---从尾到头打印单链表
从尾到头打印单链表PS:如果题设不要求不能改变链表结构时,可以使用单链表的逆置(之前已经写过),单链表的逆置改变了链表的方向,严格要求时不能这样写。解1:原创 2017-07-18 15:04:26 · 542 阅读 · 1 评论 -
剑指offer 22---判断元素出栈、 入栈顺序的合法性
题目:判断元素出栈、 入栈顺序的合法性。 如: 入栈的序列(1,2,3,4,5) , 出栈序列为(4,5,3,2,1) 是合法序列, 入栈的序列(1,2,3,4,5) , 出栈序列为(1,5,3,2,4) 是不合法序列。代码实现如下:#include #include #include #include using namespace std;//判断原创 2017-05-12 13:32:41 · 855 阅读 · 0 评论 -
剑指offer 18---输入两棵二叉树A和B,判断B是不是A的子结构
输入两棵二叉树A和B,判断B是不是A的子结构思路:1.先在A中找和B的根节点相同的结点2.找到之后遍历对应位置的其他结点,直到B中结点遍历完,都相同时,则B是A的子树3.对应位置的结点不相同时,退出继续在A中寻找和B的根节点相同的结点,重复步骤,直到有任何一棵二叉树为空退出/*struct TreeNode { int val; struct Tr原创 2017-07-23 17:36:34 · 1832 阅读 · 0 评论 -
剑指offer 6---由前序遍历和中序遍历重建二叉树
由前序遍历和中序遍历重建二叉树思路分析: 代码实现:#include #include #include using namespace std;template struct BinaryTreeNode{ T _data; //节点的值 BinaryTreeNode* _left; BinaryTreeNode* _rig原创 2017-05-19 15:28:38 · 842 阅读 · 0 评论 -
不用判断语句找最大数--程序员面试宝典
面试题:不使用判断语句,找出两个数中的最大的。解一:int main(){ int a = 100000; int b = 98; int max = ((a + b) + abs(a - b)) / 2; cout <<"最大数:"<< max << endl; system("pause"); return 0;}解二:bool Max(int& a原创 2017-06-28 19:02:49 · 1003 阅读 · 1 评论 -
判断一棵二叉树是否是完全二叉树
判断一棵二叉树是否是完全二叉树定义: 完全二叉树就是除最后一层外,每一层上的节点数均达到最大值,在最后一层上只缺少右边的若干节点。 满二叉树是特殊的完全二叉树。如图:这些均为完全二叉树: 这个为满二叉树这些均为不完全二叉树:解题思路:1.原创 2017-05-22 13:46:26 · 1036 阅读 · 0 评论 -
计数排序
计数排序 计数排序是一种非比较的排序算法优势: 计数排序在对于一定范围内的整数排序时,时间复杂度为O(N+K) (K为整数在范围)快于任何比较排序算法,因为基于比较的排序时间复杂度在理论上的上下限是O(N*log(N))。缺点: 计数排序是一种牺牲空间换取时间的做法,并且当K足够大时O(K)>O(N*lo原创 2017-05-26 13:54:19 · 698 阅读 · 0 评论