本篇文章,禁止转载!
1 树的深度优先算法、广度优先算法,及非递归实现的特点
答案:
二叉树的遍历:
访问根结点,L:遍历根结点的左子树,R:遍历根结点的右子树。
给定一棵二叉树的前序遍历序列和中序遍历序列可以惟一确定一棵二叉树。
二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。
深度优先遍历二叉树。
1. 中序遍历(LDR)的递归算法:
若二叉树为空,则算法结束;否则:
中序遍历根结点的左子树;
访问根结点;
中序遍历根结点的右子树。
2. 前序遍历(DLR)的递归算法:
若二叉树为空,则算法结束,否则:
访问根结点;
前序遍历根结点的左子树;
前序遍历根结点的右子树。
3. 后序遍历(LRD)的递归算法:
若二叉树为空,则算法结束,否则:
后序遍历根结点的左子树;
后序遍历根结点的右子树;
访问根结点。
广度优先遍历二叉树。
广度优先周游二叉树(层序遍历)是用队列来实现的,从二叉树的第一层(根结点)开始,自上至下逐层遍历;在同一层中,按照从左到右的顺序对结点逐一访问。
按照从根结点至叶结点、从左子树至右子树的次序访问二叉树的结点。算法:
- 初始化一个队列,并把根结点入列队;
- 当队列为非空时,循环执行步骤3到步骤5,否则执行6;
- 出队列取得一个结点,访问该结点;
- 若该结点的左子树为非空,则将该结点的左子树入队列;
- 若该结点的右子树为非空,则将该结点的右子树入队列;
- 结束。
栈是实现递归的最常用的结构,利用一个栈来记下尚待遍历的结点或子树,以备以后访问,可以将递归的深度优先遍历改为非递归的算法。
1. 非递归前序遍历:遇到一个结点,就访问该结点,并把此结点推入栈中,然后下降去遍历它的左子树。遍历完它的左子树后,从栈顶托出这个结点,并按照它的右链接指示的地址再去遍历该结点的右子树结构。
2. 非递归中序遍历:遇到一个结点,就把它推入栈中,并去遍历它的左子树。遍历完左子树后,从栈顶托出这个结点并访问之,然后按照它的右链接指示的地址再去遍历该结点的右子树。
3. 非递归后序遍历:遇到一个结点,把它推入栈中,遍历它的左子树。遍历结束后,还不能马上访问处于栈顶的该结点,而是要再按照它的右链接结构指示的地址去遍历该结点的右子树。遍历遍右子树后才能从栈顶托出该结点并访问之。另外,需要给栈中的每个元素加上一个特征位,以便当从栈顶托出一个结点时区别是从栈顶元素左边回来的(则要继续遍历右子树),还是从右边回来的(该结点的左、右子树均已周游)。特征为Left表示已进入该结点的左子树,将从左边回来;特征为Right表示已进入该结点的右子树,将从右边回来。
4. 简洁的非递归前序遍历:遇到一个结点,就访问该结点,并把此结点的非空右结点推入栈中,然后下降去遍历它的左子树。遍历完左子树后,从栈顶托出一个结点,并按照它的右链接指示的地址再去遍历该结点的右子树结构。
图的深度优先搜索法是树的先根遍历的推广,它的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续。如果当前被访问过的顶点的所有邻接顶点都已被访问,则退回到已被访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点w,从w出发按同样的方法向前遍历,直到图中所有顶点都被访问。
图的广度优先搜索是树的按层次遍历的推广,它的基本思想是:首先访问初始点vi,并将其标记为已访问过,接着访问vi的所有未被访问过的邻接点vi1,vi2, …, vi t,并均标记已访问过,然后再按照vi1,vi2, …, vi t的次序,访问每一个顶点的所有未被访问过的邻接点,并均标记为已访问过,依次类推,直到图中所有和初始点vi有路径相通的顶点都被访问过为止。
2 在一个很大的整数数组集合里,找出前100个最大的数字
3 输入任意2个数A和B,六种操作分别是+12,-12,+7,-7,+5,-5。A经过若干次操作,变成B。求最短路径
4 给定一个字符串集合,格式如:{aaa,bbb,ccc} {bbb,ddd} {eee,fff} {ggg} {ddd,hhh} 要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出:
5 大数的加、减、乘、除运算
使用数组逐位运算、使用计数器存储进位
6 找到数组中第一个大于V的数
排序,使用二分查找,左边界采用每次比较加一逐渐收缩
7 使用数组实现栈,栈的附加功能要求O(1)的时间找到栈中最大的值
另外使用一个长度为n的数组,压栈时在此数组下标为栈大小的位置存储栈的最大值
8 用两个栈实现队列的功能
将一个stack设为入栈,另一个stack设为出栈。入数据时直接入到入栈。出数据时如出栈空,从入栈挪到出栈,再出。出数据时如出栈有数据,直接从出栈出数据。
9 爬格子,4*3格子,一次可以往上爬,或往右爬,从左下角爬到右上角有多少种爬法?
推导公式:DP(i,j)=DP(i-1,j)+DP(i,j-1)且注意i,j为0时的情况。
10 求一棵二叉树中相距最远的两个节点之间的距离. 距离定义为两个节点间路径的边的个数。比如,父子节点间的距离是1,用文字描述思路
java基础
1 HashMap 实现原理
2 Java NIO原理和使用
3 垃圾回收机制及优化
4 Vector和list区别
5 使用wait、notify、notifyAll实现生产者和消费者模式
6 Synchronized和volatile 两个关键字的作用
7 String、StringBuffer、StringBuilder三者区别
c/c++基础
1 虚函数如何实现, 类的构造函数和析构函数可以是虚函数吗?为什么?【虚函数表,每个类的实例都有一个指向虚函数表的指针,构造函数不可以是虚函数】
2 宏定义(define)和常量定义(const)的区别 【define在预处理时被替换掉,内存中并不占数据空间,而const是一个存在的变量,可以调式查看】
3 堆和栈的区别 【栈通常由编译器自动分配释放,存放函数的参数值,局部变量的值等,堆一般由程序员分配释放,malloc/new等操作】
4 什么是缓冲区溢出?有什么危害?其原因是什么?【在程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。】
5 用c实现一个revert函数 它的功能是将输入的字符串在原串上倒序后返回
数据库
1 数据库事务的四大特性
答案:
事务的:原子性、一致性、分离性、持久性
原子性、一致性、分离性、持久性
(1) 原子性
事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。
事务的原子性要求,如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。就是说事务的操纵序列或者完全应用到数据库或者完全不影响数据库。这种特性称为原子性。
假如用户在一个事务内完成了对数据库的更新,这时所有的更新对外部世界必须是可见的,或者完全没有更新。前者称事务已提交,后者称事务撤消(或流产)。DBMS必须确保由成功提交的事务完成的所有操纵在数据库内有完全的反映,而失败的事务对数据库完全没有影响。
(2) 一致性
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。
一致性处理数据库中对所有语义约束的保护。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。例如,当数据库处于一致性状态S1时,对数据库执行一个事务,在事务执行期间假定数据库的状态是不一致的,当事务执行结束时,数据库处在一致性状态S2。
(3) 分离性
分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。
分离性是DBMS针对并发事务间的冲突提供的安全保证。DBMS可以通过加锁在并发执行的事务间提供不同级别的分离。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。
DBMS可以在并发执行的事务间提供不同级别的分离。分离的级别和并发事务的吞吐量之间存在反比关系。较多事务的可分离性可能会带来较高的冲突和较多的事务流产。流产的事务要消耗资源,这些资源必须要重新被访问。因此,确保高分离级别的DBMS需要更多的开销。
(4)持久性
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障。持久性通过数据库备份和恢复来保证。
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即对已提交事务的更新能恢复。一旦一个事务被提交,DBMS必须保证提供适当的冗余,使其耐得住系统的故障。所以,持久性主要在于DBMS的恢复性能。
2 数据库隔离级别
3 数据库设计与查询
(1)设计数据库表完成以下需求:学生可以选课,每个学生可以选修不同的课程,每个学生选修的课程都有一门成绩
(2)赵老师带的班有多少学生select count(sid)学生数量 from student where tid in (select tid from team where team.thid =(select teacher.thid from teacher where thname = '赵老师'))
(3)赵老师带的班的学生学了几门课 select score.sid,count(score.cid) from score group by sid having score.sid in (select student.sid from student where tid in(select tid from team where team.thid = (select teacher.thid from teacher where thname = '赵老师')))
(4)赵老师带的班的学生每门课的成绩select score.cid,student.sid,student.stuname,cname,score from student full outer join score on student.sid=score.sid join course on course.cid=score.cid where tid in (select tid from team where team.thid = (select teacher.thid from teacher where thname = '赵老师'))
(5)赵老师带的班的学生的成绩的平均分select score.sid,avg(score) from score group by sid having score.sid in (select student.sid from student where tid in (select tid from team where team.thid =(select teacher.thid from teacher where thname = '赵老师')))
(6)所有学生平均成绩最高者和平均成绩最低者的分数和学号select sid,p from(select sid,p from (select score.sid,avg(score)p from score group by score.sid)order by p)where rownum = 1
(7)所有学生中单科成绩最高者和最低者的分数和学号select sid,score from score where score>=all(select score from score)or score<=all(select score from score) (8)所有学生中平均成绩排名第二到第四的人的姓名、和老师及平均分select sid,p,stuname,thname from (select s.sid,p,stuname,thname ,rownum r from (select sid,p from (select score.sid,avg(score)p from score group by score.sid)order by p desc) s join student on student.sid = s.sid join team on student.tid = team.tid join teacher on team.thid = teacher.thid) where r between 2 and 4
逻辑/设计/解决问题
1 设计模式
2 进程与线程之间的联系与区别
3 在浏览器中输入http://www.baidu.com,从输入到页面在浏览器中显示出来,期间发生了哪些过程,越详细越好
python
1.怎么理解lambda函数,用于什么地方
lambda parameters: expression
lambda 函数就是一个没有函数名称,且只支持一行表达式的简易函数。
有时候可以把很多需要简单函数的地方简化,省却了建立函数的步骤,甚至不用费力去想函数的命名。
2.怎么样获取函数的使用方法
help()
3.列表序列元组,词典(字典)的区别
列表 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个 序列 的项目。[] 中(方)括号包含,括号分割["1","2","3"]
元组 元组和列表十分类似,只不过元组和字符串一样是 不可变的 即你不能修改元组。()小(圆)括号包含,逗号分隔("1","2","3")
元组通常用在使语句或用户定义的函数能够安全地采用一组值的时候,即被使用的元组的值不会改变。
词典 键值对 注意,你只能使用不可变的对象(比如字符串)来作为字典的键,但是你可以不可变或可变的对象作为字典的值。基本说来就是,你应该只使用简单的对象作为键。
键值对在字典中以这样的方式标记:d = {key1 : value1, key2 : value2 }。注意它们的键/值对用冒号分割,而各个对用逗号分割,所有这些都包括在花括号中。
4.python继承,多继承
5.python对象比较
通常,你可以通过使用 = 比较任意两个 Python 对象,不只是类实例。有一些规则,定义了何时内置数据类型被认为是相等的,例如,字典在有着全部相同的关键字和值时是相等的。对于类实例,你可以定义 cmp 方法,自已编写比较逻辑,然后你可以使用 = 来比较你的类,Python 将会替你调用你的 cmp 专用方法。