找工作
萌萌的生活
这个作者很懒,什么都没留下…
展开
-
面试题57(一):和为s的两个数字
一、题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。二、关键1.两个指针,一个指向头一个指向尾,按照规则向中间靠拢。三、解释四、代码#include <cstdio>bool FindNumbersWithSum(int data[], int length, int sum, ...转载 2018-10-19 17:46:52 · 128 阅读 · 0 评论 -
面试题33:二叉搜索树的后序遍历序列(基本没思路)
一、题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。二、关键1.递归思想。2.分组和分组依据(最后一个是根节点+比根小的是左子树,比根大的是右子树)。三、解释1.解题依据:在后序遍历得到的序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两个部分:第一个部分是左...转载 2018-10-17 09:16:12 · 97 阅读 · 0 评论 -
面试题32(一):不分行从上往下打印二叉树(层次遍历二叉树)
一、题目从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。二、关键1.使用队列deque。三、解释1.解题思想:从上到下打印二叉树的规律:每次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾。接下来到队列的头部取出最早进入队列的节点,重复上面的打印操作,直至队列中所有的节点都被打印出来。四、代码#include <c...转载 2018-10-17 09:15:39 · 173 阅读 · 0 评论 -
面试题31:栈的压入、弹出序列
一、题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。二、关键1.建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从该栈中弹出数字。...转载 2018-10-17 09:15:31 · 120 阅读 · 0 评论 -
面试题27:二叉树的镜像
一、题目请完成一个函数,输入一个二叉树,该函数输出它的镜像。二、关键三、解释1.解题思路:先前序遍历这棵树的所有节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有非叶节点的左、右节点之后,就得到了树的镜像。2.(尚未证明)解题思路二:直接前序遍历,不过先遍历右边的,再遍历左边的;交换正常的前序遍历中的后面两步。四、代码#include <cstd...转载 2018-10-16 15:45:11 · 122 阅读 · 0 评论 -
面试题26:树的子结构
一、题目输入两棵二叉树A和B,判断B是不是A的子结构。二、关键三、解释1.第一步,在树A中找到和树B的根节点的值一样的节点R;第二步,判断以R为根节点的子树是不是包含和树B一样的结构。2.在树A中找与树B根节点的值一样的节点:使用递归的方法遍历树。3.判断树A中以R为根节点的子树是不是和树B具有相同的结构?如果节点R的值和树B的根节点不相同,则以R为根节点的子树和树B肯定不...转载 2018-10-16 15:35:30 · 101 阅读 · 0 评论 -
面试题25:合并两个排序的链表
一、题目输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入图3.11中的链表1和链表2,则合并之后的升序链表如链表3所示。二、关键1.递归过程,使用递归函数解决。2.一个链表是空的,结果是不为空的那个。三、解释1.合并两个链表的过程:链表1的头结点的值小于链表2的头结点的值,因此链表2的头结点就是合并后的链表的头结点。相反,那么链表2的头结...转载 2018-10-16 15:17:45 · 181 阅读 · 0 评论 -
面试题24:反转链表
一、题目定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。二、关键1.三个指针:当前遍历的节点、前一个节点、后一个节点。2.输入的链表头结点是nullptr。输入的链表只有一个节点。输入的链表有多个节点。三、解释四、代码#include <cstdio>#include "..\Utilities\List.h"ListNode...转载 2018-10-16 15:00:48 · 133 阅读 · 0 评论 -
面试题23:链表中环的入口结点
一、题目一个链表中包含环,如何找出环的入口结点?例如,在图3.8的链表中,环的入口结点是结点3。二、关键三、解释1.方法一:使用两个指针解决。(1)判断一个链表中有环?定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追上了走的慢的指针,那么链表中一定有环。如果走的快的指针走到了链表的结尾都没有追上走的慢的指针,那么链表中没有环。...转载 2018-10-16 10:29:52 · 332 阅读 · 0 评论 -
面试题54:二叉搜索树的第k个结点
一、题目给定一棵二叉搜索树,请找出其中的第k大的结点。二、关键1.中序遍历的结果中,第k个就是第k大。三、解释四、代码#include <cstdio>#include "../Utilities/BinaryTree.h"const BinaryTreeNode* KthNodeCore(const BinaryTreeNode* pRoot, uns...转载 2018-11-16 10:41:48 · 127 阅读 · 0 评论 -
面试题53(三):数组中数值和下标相等的元素
一、题目假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数找出数组中任意一个数值等于其下标的元素。例如,在数组{-3, -1,1, 3, 5}中,数字3和它的下标相等。二、关键三、解释四、代码#include <cstdio>int GetNumberSameAsIndex(const int* numbers, int length)...转载 2018-11-16 10:42:01 · 392 阅读 · 1 评论 -
面试题53(二):0到n-1中缺失的数字
一、题目一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。二、关键三、解释1.解题思想:基于二分查找的思想来查找,如果中间元素的值和下标相等,那么下一轮只用查找右半边,如果中间元素的值和下标不相等,并且它前面一个元素和它的下标相等,则中间这个数字正好是第一个值和下标不相...转载 2018-11-16 10:41:38 · 765 阅读 · 1 评论 -
面试题53(一):数字在排序数组中出现的次数
一、题目统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3,3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。二、关键三、解释四、代码#include <cstdio>int GetFirstK(const int* data, int length, int k, int start, int end);in...转载 2018-10-19 17:47:47 · 186 阅读 · 0 评论 -
面试题48:最长不含重复字符的子字符串
一、题目请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从'a'到'z'的字符。二、关键1.使用一个数组来保存某个字符最近出现的位置。2.三、解释1.方法一:2.方法二:(推荐掌握)具体见P236四、代码#include <string>#include <iostream>// 方...转载 2018-10-19 17:47:40 · 147 阅读 · 0 评论 -
面试题13:机器人的运动范围
一、题目地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动,它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18。 但它不能进入方格(35, 38),因为3+5+3+8=19。请问该机器人能够到达多少个格子?二、关键三、解释机器人从坐标(0,0)开始移...转载 2018-10-15 10:01:03 · 49 阅读 · 0 评论 -
面试题11:旋转数组的最小数字
一、题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。二、关键有待补充三、解释四、代码#include <cstdio>#include <exception>in...转载 2018-10-15 09:32:23 · 62 阅读 · 0 评论 -
面试题35:复杂链表的复制
一、题目请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr。二、关键1.在原始链表上扩充新的链表。2.m_pSibling指针的指向问题。3.拆分链表。三、解释1....转载 2018-10-17 09:16:28 · 100 阅读 · 0 评论 -
面试题55(一):二叉树的深度
一、题目输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。二、关键三、解释四、代码#include <cstdio>#include "..\Utilities\BinaryTree.h"int TreeDepth(const BinaryTreeNode* pRoot){ ...转载 2018-10-19 17:46:31 · 120 阅读 · 0 评论 -
面试题30:包含min函数的栈
一、题目定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。二、关键1.添加辅助栈,每次添加一个元素,就往辅助栈中添加当前最小的那个元素。三、解释四、代码#pragma once#include <stack>#include <assert.h>temp...转载 2018-10-17 09:15:19 · 68 阅读 · 0 评论 -
面试题55(二):平衡二叉树
一、题目输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。二、关键三、解释四、代码#include <cstdio>#include "..\Utilities\BinaryTree.h"// ====================方法1====================...转载 2018-10-19 17:46:42 · 137 阅读 · 0 评论 -
面试题45:把数组排成最小的数(不会)
一、题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。二、关键三、解释1.解题思路:如果两个数字m和n能后拼接成数字mn和nm。如果mn<nm,那么我们应该打印出mn,也就是m应该排在n的前面,我们定义此时m小于n;反之,如果nm<mn,则...转载 2018-10-19 17:47:33 · 122 阅读 · 0 评论 -
面试题44:数字序列中某一位的数字(没看懂)
一、题目数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数求任意位对应的数字。二、关键三、解释p225.四、代码#include <iostream>#include <algorithm>using namespace s...转载 2018-10-18 15:34:54 · 418 阅读 · 2 评论 -
面试题43:从1到n整数中1出现的次数(不会)
一、题目输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。二、关键三、解释四、代码#include <cstdio>#include <cstring>#include <cstdlib>// ==================...转载 2018-10-18 15:34:43 · 150 阅读 · 0 评论 -
面试题42:连续子数组的最大和
一、题目输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。二、关键1.两个变量:一个变量表示累加的子数组和、一个变量最大的子数组和。三、解释1.思路一:根据从头到尾逐个累加的例子中得到的规律,编写代码。2.思路二:使用动态规划。用f(i)表示以第i个数字结尾的子数组的最大和,那么我们的目标是...转载 2018-10-18 15:34:32 · 90 阅读 · 0 评论 -
面试题41:数据流中的中位数(没看懂)
一、题目如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。二、关键三、解释四、代码#include <cstdio>#include <algorithm>#include <vector>#incl...转载 2018-10-18 15:34:24 · 158 阅读 · 0 评论 -
面试题40:最小的k个数
一、题目输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。二、关键三、解释1.解法一:使用Partition函数来解决。如果基于数组的第k个数字来调整,则使得比第k位数字小的所有数字都位于数组的坐标,比第k个数字大的所有数字都位于数组的右边。这样调整之后,位于数组中左边的k个数字就是最小的k个数字。限制:数组中数...转载 2018-10-18 15:34:13 · 160 阅读 · 0 评论 -
笔试+STL+库函数
一、常见的库函数1.笔试时常用的STL库函数。向量容器(vector)、列表容器(list)和双端队列容器(deque)类分别位于<vector>、<list>和<deque>中。 集合容器(set)和多重集合容器(multiset)位于<set>中。 映射容器(map)和多重映射容器(multimap)位于<map>中。 ...原创 2018-04-07 15:09:08 · 333 阅读 · 0 评论 -
面试题39:数组中出现次数超过一半的数字(要掌握第二种)
一、题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。二、关键三、解释1.解法一、时间复杂度为O(n)的算法得到数组中任意第k大的数字的算法?先在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字都在...转载 2018-10-18 15:33:29 · 244 阅读 · 0 评论 -
面试题38 :字符串的排列
一、题目输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。二、关键1.将字符串看成两部分:第一个字符;第一个字符后面的所有字符。2.递归思想。三、解释1.解题思路:求整个字符串的排列可以看成两步。第一步求所有可能出现在第一个位置的字符,即把第一个字符和后面...转载 2018-10-18 15:23:43 · 175 阅读 · 0 评论 -
全局变量、局部变量、const、static、内存管理和释放
一、全局变量 全局变量也称为外部变量,是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,应该做全局变量说明。只有在函数内经过说明的全局变量才能使用。但在一个函数之前定义的全局变量,在该函数内使用可以不再加以说明。 如何在不同文件中引用一个已经定义过的全局变量?可以用引用头文件的方式,也可以用extern关键字。二、...转载 2018-11-16 10:42:24 · 8810 阅读 · 0 评论 -
面试题37:序列化二叉树
一、题目请实现两个函数,分别用来序列化和反序列化二叉树。二、关键1.序列化规则:三个。在根据前序遍历的顺序来序列化二叉树。在遍历时,碰到nullptr指针时,将这种指针序列化为特殊的字符“$”。节点的数值之间使用特殊字符“,”隔开。三、解释详见《剑指offer》P195分析。四、代码#include <cstdio>#include "..\Utilit...转载 2018-10-18 15:23:13 · 144 阅读 · 0 评论 -
面试题36:二叉搜索树与双向链表(没有思路)
一、题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。二、关键三、解释四、代码#include <cstdio>#include "..\Utilities\BinaryTree.h"void ConvertNode(BinaryTreeNode* pNode, BinaryTreeNode...转载 2018-10-18 15:22:58 · 80 阅读 · 0 评论 -
面试题36:二叉搜索树与双向链表(没有思路)
一、题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。二、关键1.把树分成3部分来考察:根节点、左子树、右子树,然后把左子树中最大的节点、根节点、右子树中最小的节点链接起来。2.递归策略。三、解释1.理论分析是否能够将二叉搜索树转换为双向链表?在二叉树中,每个节点都有两个指向子节点的指针。在双向链表中,每个...转载 2018-10-18 15:23:26 · 131 阅读 · 0 评论 -
面试题32(三):之字形打印二叉树
一、题目请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。二、关键1.两个栈。2.两个层的交替。三、解释1.解题思路:按之字形顺序打印二叉树需要两个栈。我们在打印某一层节点时,把下一层的子节点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子节点再保存右子节点到第一个栈中...转载 2018-10-17 09:16:03 · 109 阅读 · 0 评论 -
面试题10:斐波那契数列
一、题目写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。二、关键三、解释四、应用1.青蛙跳台阶问题-1。题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级台阶总共有多少种方法。思路:最简单情况:如果只有1级台阶,显然只有一种跳法。如果有2级台阶,就有2种跳法。一种是分两次跳,每次跳1级;另一种是一次跳两级。一般情况:把...转载 2018-10-15 09:32:34 · 205 阅读 · 0 评论 -
用两个队列实现一个栈
一、题目二、关键三、解释插入元素:将元素插入到最后插入的元素所在的队列。(两个都为空,则插入队列1;一个为空,一个不为空,插到那个不为空的队列中;不存在两个都不为空的情况)删除元素:将最后一个元素所在的队列中的其他元素,从头部删除,加入到另个一队列的尾部,使得该队列中只保留最后一个元素。然后删除该元素,就实现了栈的弹出。四、代码...转载 2018-10-14 21:01:59 · 92 阅读 · 0 评论 -
面试题9:用两个栈实现队列
一、题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。二、关键1.关于队列的插入和删除:只在stack1中插入,只在stack2中删除。2.关于倒水操作:只在stack2为空时,把stack1中元素弹出压倒stack2中。其他情况不进行倒水的操作。三、解释删除一个元素的...转载 2018-10-14 20:54:05 · 97 阅读 · 0 评论 -
mysql的两大数据库引擎
MySQL存储引擎中的MyISAM和InnoDB区别详解在MySQL 5.5之前,MyISAM是mysql的默认数据库引擎,其由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然MyISAM性能极佳,但却有一个显著的缺点: 不支持事务处理。不过,MySQL也导入了另一种数据库引擎InnoDB,以强化参考完整性与并发违规处理机制,...转载 2018-09-20 21:10:56 · 643 阅读 · 0 评论 -
LRU
LRUcache的实现https://juejin.im/post/5a9e6835f265da23937697ea-简单通俗容易理解http://www.importnew.com/18758.htmlhttps://blog.csdn.net/hxqneuq2012/article/details/52709652 LRUcache实现的python代码:class ...转载 2018-09-20 21:10:17 · 132 阅读 · 0 评论 -
红黑树
红黑树定义:红黑树(如上图,引用自维基百科)是一种 自平衡 的二叉树,所谓的自平衡是指在插入和删除的过程中,红黑树会采取一定的策略对树的组织形式进行调整,以尽可能的减少树的高度,从而节省查找的时间。红黑树的特点:红黑树的特性如下:结点是红色或黑色 根结点始终是黑色 叶子结点(NIL 结点)都是黑色 红色结点的两个直接孩子结点都是黑色(即从叶子到根的所有路径上不存在两个连续...转载 2018-09-20 21:08:21 · 55 阅读 · 0 评论