剑指offer学习--初级c++面试题】的更多相关文章

定义一个空的类型,里面没有任何成员函数和成员变量,对该类型求sizeof,得到的结果是多少? 答案是1.空类型中的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,他必须在内存中占有一定的空间,否则无法使用这些实例.至于占用多少内存,由编译器决定.Visual Studio中每个空类型的实例占用1字节的空间. 如果在该类型中添加一个构造函数和析构函数,在对该类型求sizeof,得到的结果又是多少? 和前面一样,还是1.调用构造函数和析构函数只需要知道函数的地址即…
最近一直看剑指Offer.里面很多算法题.于是就想着用PHP来显示一下. 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 拿到这个题目.我们第一个反应,就是遍历二维数组.然后逐个进行比较.我们不难用PHP进行实现.于是有了下面的代码 function TwoArrayFind($array,$search) { $found = false; if(empty($ar…
题目:一个链表中包括环.怎样找出环的入口结点? 解题思路 能够用两个指针来解决问题.先定义两个指针P1和P2指向链表的头结点.假设链表中环有n个结点,指针P1在链表上向前移动n步,然后两个指针以同样的速度向前移动. 当第二个指针指向环的入口结点时,第一个指针已经环绕着环走了一圈又回到了入口结点. 剩下的问题就是怎样得到环中结点的数目.我们在面试题15的第二个相关题目时用到了一快一慢的两个指针. 假设两个指针相遇,表明链表中存在环.两个指针相遇的结点一定是在环中. 能够从这个结点出发.一边继续向前…
题目:请实现两个函数,分别用来序列化和反序列化二叉树. 解题思路 通过分析解决前面的面试题6.我们知道能够从前序遍历和中序遍历构造出一棵二叉树.受此启示.我们能够先把一棵二叉树序列化成一个前序遍历序列和一个中序序列.然后再反序列化时通过这两个序列重构出原二叉树. 这个思路有两个缺点.一个缺点是该方法要求二叉树中不能用有数值反复的结点. 另外仅仅有当两个序列中全部数据都读出后才干開始反序列化. 假设两个遍历序列的数据是从一个流里读出来的,那就可能须要等较长的时间. 实际上假设二叉树的序列化是从根结…
题目:给定一个数组和滑动窗体的大小,请找出全部滑动窗体里的最大值. 举例说明 比如,假设输入数组{2,3,4,2,6,2,5,1}及滑动窗体的大小.那么一共存在6个滑动窗体,它们的最大值分别为{4,4,6,6,6,5}. 解题思路 假设採用蛮力法,这个问题似乎不难解决:能够扫描每个滑动窗体的全部数字并找出当中的最大值.假设滑动窗体的大小为k,须要O(k)时间才干找出滑动窗体里的最大值.对于长度为n的输入数组,这个算法总的时间复杂度是O(nk). 实际上一个滑动窗体能够看成是一个队列.当窗体滑动时…
题目:请实现一个函数用来找出字符流中第一个仅仅出现一次的字符. 举例说明 比如,当从字符流中仅仅读出前两个字符"go"时.第一个仅仅出现一次的字符是'g'.当从该字符流中读出前六个字符"google"时,第一个仅仅出现1次的字符是"l". 解题思路 字符仅仅能一个接着一个从字符流中读出来.能够定义一个数据容器来保存字符在字符流中的位置.当一个字符第一次从字符流中读出来时,把它在字符流中的位置保存到数据容器里.当这个字符再次从字符流中被读出来时.那…
题目:请完毕一个函数,输入一个二叉树,该函数输出它的镜像. 二叉树结点的定义: /** * 二叉树的树结点 */ public static class BinaryTreeNode { int value; BinaryTreeNode left; BinaryTreeNode right; } 解题思路: 我们先前序遍历这棵树的每一个结点.假设遍历到的结点有子结点.就交换它的两个子结点.当交换全然部非叶子结点的左右子结点之后.就得到了树的镜像. 代码实现: public class Test…
题目:一个整型数组里除了两个数字之外.其它的数字都出现了两次,请敲代码找出这两个仅仅出现一次的数字. 要求时间复杂度是O(n),空间复杂度是O(1). 举例说明 比如输入数组{2, 4, 3, 6, 3, 2, 5 },由于仅仅有4 .6 这两个数字仅仅出现一次,其它数字都出现了两次,所以输出4和6 . 解题思路 这两个题目都在强调一个(或两个)数字仅仅出现一次,其它的出现两次. 这有什么意义呢?我们想到异或运算的一个性质:不论什么一个数字异或它自己都等于0.也就是说. 假设我们从头到尾依次异或…
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位予数组的后半部分. 这个题目要求把奇数放在数组的前半部分, 偶数放在数组的后半部分,因此全部的奇数应该位于偶数的前面.也就是说我们在扫描这个数组的时候, 假设发现有偶数出如今奇数的前面.我们能够交换它们的顺序,交换之后就符合要求了. 因此我们能够维护两个指针,第一个指针初始化时指向数组的第一个数字,它仅仅向后移动:第二个指针初始化时指向数组的最后一个数字, 它仅仅向前移动. 在两个指针相遇之前…
题目:把n个骰子扔在地上,全部骰子朝上一面的点数之和为s.输入n.打印出s 的全部可能的值出现的概率. 解题思路 解法一:基于通归求解,时间效率不够高. 先把n个骰子分为两堆:第一堆仅仅有一个.还有一个有n- 1 个.单独的那一个有可能出现从1 到6 的点数. 我们须要计算从1 到6 的每一种点数和剩下的n-1 个骰子来计算点数和.接下来把剩下的n-1个骰子还是分成两堆,第一堆仅仅有一个, 第二堆有n-2 个.我们把上一轮那个单独骰子的点数和这一轮单独骰子的点数相加. 再和剩下的n-2 个骰子来…