解决面试题的思路
很多面试官都喜欢应聘者在写代码之前先讲清楚思路,举例子和画图都是很好的方法
面试官希望应聘者在分析中发现自己想法中的错误和漏洞。
面试题19:二叉树的镜像
面试题20:顺时针打印矩阵
输入一个矩阵,从外向里以顺时针的顺序依次打印出每个数字
每打印一圈的起始点选为对角线上的点,即此时x = y
判断循环继续的条件是columns > 2 * start 并且 rows > 2 * start
注意最后一圈的情况可能会退化为一行、一列、甚至是只有一个数字
面试题21:包含min函数的栈
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
利用一个辅助栈始终记录数据栈当前的最小值。
断言包含assert.h文件
断言语句示例(括号内是true的语句,若为false出错)
assert(m_data.size() > 0 && m_min.size() > 0);
面试题22:栈的压入弹出序列
题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。
分析:这里的压入弹出不是一次性完成的,比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列
写函数第一步一定要要先判断非法输入 指针是否为NULL 长度大于0等等。!!!
因为const、&等的运用可以加分,所以要记得,特别是形参部分的&和const
这是我自己写的,没看源码
面试题23:从上往下遍历二叉树
题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
典型的层序遍历,利用先进先出的队列,一次从后面放入待处理的数据,在前面取出数据进行处理
不管是广度优先遍历一个有向图还是一棵树,都要用到队列。第一步把其实节点(在树中是指根节点)放入到队列中,接下来每一次从队列头部取出一个节点,遍历这个节点之后把从它能到达的节点(対树而言是子节点)都依次放入队列。我们重复这个遍历过程,直到队列中的节点全部都被遍历为止。
面试题24:二叉搜索树的后续遍历序列
这题省略
面试题26:复杂链表的赋值
- 可以利用空间换时间,建立哈希表,把<S,S’>映射到哈希表上,就可以方便地找到m_pSibling指针的指向。空间和时间复杂度均为O(n)。
- 亮点在于一开始节点创建时的不同,N点对应的N’点是直接连接在N点之后的,那么要找的N’的m_pSibling指向的对象就是N的m_pSibling指向的对象的下一个。
面试题27:二叉搜索树和双向链表
首先我们可以发现中序遍历的最后一个节点就是这棵树中的最大值。主要是用递归的思想,先排好左子树,然后是根节点,然后再去排右子树。
面试题28:字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
考查对递归理解的编程题
如果要做到相同的字符串只输出一次,则只要在交换之前判断一下是否交换即可,相同则不交换。
if(pBegin != pTemp && *pBegin == *pTemp) //添加在for循环里面的第一句
continue;
理论上相同的字符相同的位置只能算一次的才叫排列,即121、211、112构成3个排列,这里面只有一个组合。
那么要求字符串的组合呢
桶排序一下,递归输出,如果有3个a就有0、1、2、3四种方式;如果所有字符确定是不同的那么用ab = 110, c = 001, abc = 111,二进制表示选择情况(a就只有有或者没有两种情况)
求8个数的组合,然后相加判断三个对面的各是否相等即可
求不相同的排列情况,判断是否符合条件,先画一个正方体,有利于理解对面的概念。
棋子排列问题
全排列可以确定不在一行一列上,最后两个式子确定不在对角线上