C++
dcjhyn
我很平凡,但我有一颗向上的心,不奢求惊天动地,小有成就可以给予身边的人幸福即可
展开
-
1.设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象
1.设计一个类不能被继承常规解法:将构造函数设为私有函数 在C++中,子类的构造函数会自动调用父类的构造函数,子类的析构函数也会调用父类的析构函数。要想一个类不能被继承,只要把它的构造函数和析构函数都设置为私有函数。那么当一个类试图从那里继承时,势必会因为调用构造函数和析构函数而导致编译错误。 可是这个类型的构造函数和析构函数都是私有函数,我们怎样才能得到该类型的实例呢?我们可以通过定义共有的静翻译 2017-07-15 18:29:59 · 314 阅读 · 0 评论 -
一个m*n的矩阵,从左到右从上到下都是递增的,给一个数x,判断x是否在矩阵中。(高效率)
这样的矩阵可以使用一个二维数组存储,知道了矩阵的特点,选取一个元素时可以将矩阵分区 可以看到随意选一个元素的话会分成四个区域,阴影部分是可能的区域,深色的是确定比要查找的大或者小,浅色阴影是有可能,所以下一步的动作很难确定,因此,随意取一个点进行比较然后跟进的方式会很麻烦。 从特殊位置的点下手这个问题就变得简单了,右上和左下这两个点拿来比较要找的元素就很好处理,这里采用取右上元素的方式(两种思想原创 2017-07-28 19:52:38 · 3023 阅读 · 0 评论 -
迷宫矩阵(最优路径算法)
走出迷宫可以使用递归或者栈的方式,这里采用的是栈的方法,迷宫的矩阵如图,1是墙壁,0是路1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0原创 2017-08-24 17:21:35 · 4393 阅读 · 0 评论 -
已知集合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}。原创 2017-08-23 14:56:27 · 336 阅读 · 0 评论 -
判断一个节点是否在一棵二叉树中
#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;//结点template <typename T>struct TreeNode { T _data; TreeNode *_left; TreeNode *_right; TreeNode(const T& data)原创 2017-08-24 00:12:20 · 414 阅读 · 1 评论 -
判断一颗二叉树是是否是另一颗树的子树。比如tree2是tree1的子树
先在Tree1中找到与Tree2根节点相同的结点,然后将此节点当做根节点判断是否与Tree2树结构相同原创 2017-08-24 00:21:42 · 497 阅读 · 0 评论 -
翻转打印字符串分词,比如“this is a dog” 输出“dog a is this”
比如“this is a dog” 输出“dog a is this”原创 2017-09-23 20:48:03 · 822 阅读 · 0 评论 -
今日头条笔试题
#include <iostream>#include <vector>using namespace std;int main(){ int n, x, num; cin >> n >> x; vector<int> house; for (int i=0; i<n; i++){ cin >> num; house.push_ba原创 2017-10-17 22:23:59 · 576 阅读 · 0 评论 -
队列实现栈,栈实现队列
使用两个栈实现一个队列#include <iostream>#include <queue>#include <stack>using namespace std;template<typename T>class Queue{public: Queue(void){}; ~Queue(void){}; void appendTail(const T& node);原创 2017-07-19 12:57:43 · 245 阅读 · 0 评论 -
复杂链表的复制
解题思路:过程分为三步: 首先,遍历链表,复制当前结点currentNode对应的结点cloneCurNode,并将cloneCurNode放置在currentNode的后面,这样就形成一条包含原始链以及复制链的长链。然后,还需将原始链中指针的方向赋予复制链最后,将长链拆分,就得到原始链和复制链了。 /*struct RandomListNode { int label; s原创 2017-07-18 17:16:02 · 168 阅读 · 0 评论 -
-判断一棵二叉树是否是平衡二叉树/求一颗二叉树的镜像
判断一棵二叉树是否是平衡二叉树任意给定一棵二叉树,判断它是否是平衡二叉树。所谓平衡二叉树,是指二叉树中任意一个结点的左右子树的高度之差不超过1可以分两步实现。第一步先实现求解 二叉树中每个结点的高度的函数height(BinaryNode );然后先序遍历二叉树中的每一个结点node,调用height()求出该结点的左子树高度height(node.left) 和 右子树高度 height(node原创 2017-07-27 20:51:10 · 209 阅读 · 0 评论 -
求二叉树的高度/销毁一颗二叉树-->Destroy(Node* root)
int HeightOfBinatyTree1(BinaryTreeNode* pRoot) //二叉树的高度{ if (pRoot == NULL) return 0; int m = HeightOfBinatyTree1(pRoot->_pLeft); int n = HeightOfBinatyTree1(pRoot->_pRight);原创 2017-07-27 17:39:07 · 390 阅读 · 0 评论 -
求二叉树的高度
这里计算二叉树的高度采用三种不同的算法。 算法一:后序遍历二叉树,结点最大栈长即为二叉树的高度; 算法二:层次遍历二叉树,最大层次即为二叉树的高度; 算法三:采用递归算法,求二叉树的高度。 //法1:后序遍历,结点最大栈长即为树的高度 //法2:层次遍历,层次即为高度 //法3:递归算法求树高#include<iostream> #include<stack> #include<原创 2017-07-26 19:43:26 · 2289 阅读 · 1 评论 -
判断两个链表是否相交(考虑带环与不带环)
1.不考虑带环的情况,若相交,求交点解法一:如果两个链表都无环,则可以把第二个链表接在第一个链表后面,如果得到的链表有环,则说明这两个链表相交。这里如果有环,则第二个链表的表头一定在环上,只需要从第二个链表开始遍历,看是否会回到起点即可判断。假设两个链表长度分别为m和n,则时间复杂度为O(m+n) 解法二:若两个链表都无环且交于一点,那么最后一个节点一定是共有的。可以先遍历第一个链表,记录最后一个原创 2017-07-17 00:50:13 · 463 阅读 · 0 评论 -
C++模板(template)
1.模板的概念。我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。//函数1.int max(int x,int y);{return(x>y)?x:y ;}//函数2.float max( float x,转载 2017-07-19 12:54:28 · 239 阅读 · 0 评论 -
判断N!末尾有多少个0
问题:N的阶乘(N!)中的末尾有多少个0? 例如: N = 5,N! = 120.末尾有1个0. N = 10,N! = 3628800.末尾有2个0。分析:看到这个问题,有人可能第一反应是先求出N!,然后再根据求出的结果,最后得出N!的末尾有多少个0。但是转念一想,会不会溢出。其实,从”哪些数相乘可以得到10”这个角度,问题就变得比较的简单了。 首先考虑,如果N的阶乘为K和10的原创 2017-07-23 14:28:34 · 8695 阅读 · 0 评论 -
替换字符串中的空格为$$$。要求时间复杂度为O(N)
#include <iostream>using namespace std;void ReplaceBlank(char string[], int length) //length 为string数组的总容量{ if (string == NULL || length <= 0) return ; int originalLength = 0; //字符串原创 2017-07-19 16:02:21 · 402 阅读 · 0 评论 -
实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
#include <stack>#include <assert.h>template <typename T> class StackWithMin{public: StackWithMin(void) {} virtual ~StackWithMin(void) {} T& top(void); const T& top(void) const; voi转载 2017-07-19 16:46:02 · 779 阅读 · 0 评论 -
实现一棵二叉树的层序遍历
BinaryTree.h#pragma once#include <iostream>#include<deque>using namespace std;struct BinaryTreeNode{ int _value; BinaryTreeNode* _pLeft; BinaryTreeNode* _pRight;};PrintBinaryTree.cpp#i原创 2017-07-22 23:26:03 · 220 阅读 · 0 评论 -
查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)
char FirstTwiceChar(char* string){ if (string == NULL) return '\0'; const int tableSize = 256; //char类型的长度为8位,一共就256种可能 unsigned int hashTable[tableSize]; for (unsigned int i =原创 2017-07-20 00:05:43 · 266 阅读 · 0 评论 -
求二叉树叶子节点的个数/求二叉树第k层的节点个数
int FindLeavesOfBinaryTree(BinaryTreeNode* pRoot) //求二叉树叶子结点的个数{ if (pRoot == NULL) return 0; if (pRoot->_pLeft == NULL && pRoot->_pRight == NULL) return 1; return FindLeaves原创 2017-07-24 21:33:55 · 971 阅读 · 0 评论 -
找出数组出现次数超过一半的数
例如: 数组{1,2,3,4,1,1,2,1,1}中1出现了5次超过长度9的一半。因此输出1; 注:这里没有考虑出现次数最多的数字是0的情况,关键在于方法这里给出两种常用方法:解法一:基于排序(快排)的算法这种算法优点在于理解起来比较容易,如果一个数出现次数超过长度的一半,那将数组排序之后位于数组中间位置的数一定就是要找到的数。 注:需要检测一下中间的数是否是超过一半的数,因为有可能出现次数最原创 2017-07-26 15:57:58 · 363 阅读 · 0 评论 -
二叉树的前/中/后 序遍历(递归非递归两种)
一.前序遍历前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。1.递归实现void pre_order(BTree *root) 2.{ 3. if(root != NULL)//必不可少的条件,递归的出口 4. { 5. printf("%2c",root->key); //访问根结点6. pre_order(原创 2017-08-23 14:37:45 · 215 阅读 · 0 评论