每天一练
gogogo_sky
不积跬步,无以致千里;不积小流,无以成江海
展开
-
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 · 632 阅读 · 0 评论 -
求二叉树叶子节点的个数/求二叉树第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 · 1005 阅读 · 0 评论 -
求二叉树的高度/销毁一颗二叉树【递归思想】
#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 · 1226 阅读 · 0 评论 -
二叉树的层序遍历(非递归,借用队列实现)
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 · 1018 阅读 · 0 评论 -
字符串空格替换
【附加题】--替换字符串中的空格为$$$。要求时间复杂度为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 · 383 阅读 · 0 评论 -
在一个从左到右从上到下都是递增的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 · 932 阅读 · 0 评论 -
求一个二叉树的镜像/在二叉树中查找某个元素X
1.二叉树镜像 void _MirrorTree(Node* root) { //1.空树,直接返回 if (root==NULL) { return ; } //2.树只有一个结点,不用求镜像,直接返回 if(root->left==NULL&&root->rig原创 2017-07-25 00:40:59 · 1410 阅读 · 0 评论 -
定义一个只能在堆上生成对象的类&&定义一个只能在栈上生成对象的类&&定义一个类不能被继承
1.定义一个类不能被继承子类在继承父类的成员函数和成员变量之后,在子类的构造函数之前会先调用父类的构造函数,先初始化父类的成员变量,然后在子类的构造函数中初始化子类的成员变量; 所以一个类不能被继承,表示其子类在实例化对象时不成功,即不能调用父类的构造函数;那么将父类的构造函数的访问属性设置成为私有,这样一来,不论采用任何继承关系,父类的私有成员在子类中都不可见;即父类的构造函数在子类的构造函数之原创 2017-07-07 15:35:52 · 520 阅读 · 0 评论 -
单链表排序问题(冒泡/快排【前后指针法】)
#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 · 856 阅读 · 0 评论 -
链表翻转【比如链表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 · 1315 阅读 · 0 评论 -
判断一棵树是否是完全二叉树
1.【基础题】–判断一棵树是否是完全二叉树。提示:层序遍历变型题。(1)基础知识 【二叉树】:二叉树是一棵特殊的树,二叉树每个节点最多有两个孩子结点,分别称为左孩子和右孩子。【满二叉树】:高度为N的满二叉树有2^N- 1个节点的二叉树。【完全二叉树】: 若设二叉树的深度为h,除第h 层外,其它各层(1~h-1) 的结点数都达到最大个数,第h 层所有的结点都连续集中在最左边,这就是完全二叉树 【原创 2017-07-28 01:02:03 · 25423 阅读 · 8 评论 -
二叉树前序,中序,后序的遍历【递归(借用栈实现)和非递归】
#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 · 427 阅读 · 0 评论 -
【判断一个节点是否在一棵二叉树中】/【判断一颗二叉树是是否是另一颗树的子树】
1.【基础题】–判断一个节点是否在一棵二叉树中(注意多测几个节点,看是否都能找到)bool _Find(Node* root,const T x)//判断一个节点是否在一棵二叉树中 { //1.如果树为空,返回空指针 if (root==NULL) { return false; } /原创 2017-07-28 16:47:42 · 850 阅读 · 1 评论 -
两个队列实现一个栈 / 两个栈实现一个队列
一、认识栈和队列 C++ Stacks(堆栈) C++ Stack(堆栈)——是说实现了一个先进后出(FILO)的数据结构。 操作 比较和分配堆栈 empty() 堆栈为空则返回真 pop() 移除栈顶元素 push() 在栈顶增加元素 size() 返回栈中元素数目 top() 返回栈顶元素 C++ Queues(队列) C++队列是一种容器适配器,它给予程序员一种先原创 2017-07-19 17:42:08 · 315 阅读 · 0 评论 -
已知集合A和B的元素分别用不含头结点的单链表存储, 求解集合A与B的差集,并将结果保存在集合A的单链表中
1.【附加题】–已知集合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; n原创 2017-08-06 23:50:46 · 433 阅读 · 0 评论 -
合并两个有序链表/链表反转(逆置)/找链表倒数第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 · 350 阅读 · 0 评论 -
不使用加减乘除计算数字相加问题
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 · 645 阅读 · 0 评论 -
实现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 · 1300 阅读 · 0 评论 -
链表是否带环/求环的长度/求环的入口点
#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 · 412 阅读 · 0 评论 -
求两个链表的相交点(含链表带环情况)
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 · 840 阅读 · 0 评论 -
几个链表面试体(从尾逆序打印,删除某个位置,赋值复杂链表)
一、程序#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 · 271 阅读 · 0 评论 -
一个关于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 · 352 阅读 · 0 评论 -
实现一个栈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 · 893 阅读 · 0 评论 -
元素出栈、入栈顺序的合法性。
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 · 383 阅读 · 0 评论 -
位运算--求一个 数二进制中1的个数
1.五种位运算:(1)&(与)–有0则0;无0则1; (2)|(或)–有1则1,无1则0; (3)^(亦或)–相同为0,不同为1; (4)>>右移(最右边的位被抛弃) 正数,最左边添0;00001010>>3=00000001 负数,最左边添1;10001010>>3=11110001 (5)<<左移(最左边的位被抛弃)–最右边统一添0; (正数)000原创 2017-05-10 16:50:12 · 4725 阅读 · 1 评论 -
寻找一个字符串中第一个只出现两次的字符
2.【附加题】–查找一个字符串中第一个只出现两次的字符。 比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1) 解法: 利用哈希表;由于ASCII表中一共存在256个字符;所以开辟一个256大小整型数组;将这个数组看做哈希表,将字符的ASCII值当做Key值作为数组下标,将key对应的数组元素的值作为value,先遍历一遍字符串,统计原创 2017-07-20 17:52:58 · 1162 阅读 · 2 评论 -
求整数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 · 3748 阅读 · 0 评论 -
统计公司员工喜欢吃的水果,并打印出最喜欢吃的前K中水果【map关联式容器,k/V结构】
5.【附加题】– 本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。 由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果, 并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数, 并且求出大家最喜欢吃的前k种水果。 void GetFavoriteFruit(const vector原创 2017-08-06 19:58:07 · 318 阅读 · 0 评论