编程之美/程序员代码面试指南
井底的笨鸟
Stay hungry,stay foolish.
展开
-
树——从最下层向上打印二叉树(层序遍历扩展)
题目:要求按深度从下到上访问二叉树,每层顺序从左到右。例如:Given binary tree{3,9,20,#,#,15,7}, 3 / \ 9 20 / \ 15 7return its bottom-up level order traversal as:[ [15,7] [9,20], [3],原创 2016-05-11 14:01:06 · 405 阅读 · 0 评论 -
树——统计完全二叉树的节点数目
题目要求实现时间复杂度低于O(N)的解法。遍历整棵树求节点个数时间复杂度为O(N)。这里利用了完全二叉树的性质:通过比较左右子树的最左结点的高度来看哪边是满的,然后递归计算。1.首先遍历左子树最左节点找到二叉树的层数h(头节点在第1层);2.遍历右子树最左节点看是否在第h层,若在第h层,说明左子树该完全二叉树左子树是满的;否则其右子树是满的,不过叶子节点都在第h-1层;3.递归计算。//计算左子树...原创 2016-07-16 10:18:34 · 1664 阅读 · 0 评论 -
字符串——去掉字符串中连续出现k个0的子串
题目:只去掉正好出现k个‘0’的子串。举例: String s1="A00B"; k=2; return AB. String s2="A0000B000"; k=3; return A0000B.借用StringBuilder。sb.append的时间在s.charAt(i)不是‘0’的时候,那么如果s以‘0’结尾,可能会出现最后一组连续的'0原创 2016-07-17 13:16:32 · 860 阅读 · 0 评论 -
字符串——替换字符串中连续出现的指定字符串
题目:给定三个字符串str,from,to。把str中所有 from子串全部替换成 to字符串,对连续出现的 from 的部分要求只替换成一个to字符串。例如: String s1="123abc"; String s2="123abcabc"; System.out.println(""+test.replaceStr(s1, "abc",原创 2016-07-17 14:32:07 · 373 阅读 · 0 评论 -
字符串的统计字符串(count and say类似题目)
题目一:给定一个字符串str,返回其统计字符串,例如String s="aaabbadddffc";其统计字符串形式为”a_3_b_2_a_1_d_3_f_2_c_1“。最后一组总是要额外添加,且在这里形式较之前的在最后少了一个”_“.public String countAndSay(String s){ if(s == null||s.length() == 0)原创 2016-07-17 15:10:07 · 781 阅读 · 0 评论 -
求最大子矩阵的大小 (maximal-rectangle)
题目:给定一个整形矩阵map,其中的值只有0和1两种,求其中全是1的所有矩阵区域中,最大的矩形的面积。例如:图中是一个4 × 6的矩形,画出红色的是我们要找到的区域,结果返回为 4. 仔细观察发现:因为我们要找的是矩形,所以它一定是以某个行元素开始的,这样的话,其实我们要找到的某个矩形就转换成以某一个行开始的 histogram的最大矩形问题了原创 2016-07-17 19:58:39 · 676 阅读 · 0 评论 -
动态规划——回文最小分割数(palindrome-partitioning-ii)
题目:给定一个字符串str,返回把str全部切成回文子串的最小分割数。举例:str="ABA" ,不需要切割,返回0;str="ACDCDCDAD",最少需要切两次,比如"A","CDCDC","DAD",所以返回2.解题思路:动态规划问题。 dp[i] - 表示子串(0,i)的最小回文切割,则最优解在dp[s.length-1]中。(0,i)的子串中原创 2016-07-17 21:06:26 · 12501 阅读 · 2 评论 -
字符串——循环移位包含问题
题目:给定两个字符串s1,s2,要求判断s2能否被s1循环移位得到的字符串包含。例如给定s1="AABCD"和s2="CDAA“,返回true ;给定s1="ABCD"和s2="ACBD",返回false。解析:构建一个辅助字符串s = s1+s1;例如 s=s1+s1="ABCD"+"ABCD";可以看出由s1做循环移位所得到的字符串都将是s的子串。至此问题转化成原创 2016-07-17 11:41:26 · 2005 阅读 · 1 评论 -
字符串——找到被指的新类型字符
题目:自定义了3种新的字符类型:1:单个小写字母,如‘a’; 2:大写+小写字母对,如'Ab' ;2:大写+大写字母对,如'AA' 。给定满足要求的字符串和整数,返回指定位置上的新类型字符。举例:"aaABCDEcBCg", 7 返回“EC”. public String piontNewChar(String s,int k) {原创 2016-07-18 16:55:31 · 332 阅读 · 0 评论 -
树——在二叉树中找到两个节点的最低公共祖先LCA
首先利用自底向上的思路——如果遍历到当前节点是A/B中的任意一个,则向父节点汇报此节点,否则递归到节点为null时返回null值。具体情况如下几种:1.当前节点即为两个节点中的一个,此时直接向父节点返回当前节点;2.递归到null,返回null;3.当前节点不是两个节点中的一个,此时判断左右子树的返回结果: 。若左右子树均返回非空值,那么当前节点一定为所求节点,将当前节点原创 2016-07-30 10:44:12 · 776 阅读 · 0 评论 -
龙与地下城游戏问题
题目:给定一个二维数组,含义是一张地图,例如,如下矩阵:int[][] data={{-2,-3,3}, {-5,-10,1}, {0,30,-5}};游戏规则如下: 1.骑士从左上角出发,每次只能向下或向右走,最后达到右下角见到公主。 2.地图中每个位置代表骑士血量的变化,若为负数原创 2016-07-20 10:01:09 · 997 阅读 · 0 评论 -
BFS、DFS——求最短通路值
题目:用一个整形矩阵matirx表示一个网络,1代表有路,0代表无路,每一个位置只要不越界,都有上下左右四个方向,求从左上角到右下角的最短通路值。例如,matrix为: 1 0 1 1 1 1 0 1 0 1 1 1原创 2016-07-23 20:35:57 · 1471 阅读 · 0 评论 -
动态规划——最大连乘子序列
题目描述:给定一个浮点数数组,求最大连续乘积子串,例如 double[] data={-2.5,4,0,3,0.5,8,-1},最大乘积连续子串为3,0.5,8.解法一:暴力法双重for循环时间复杂度为O(N^2)解法二:考虑到乘积子序列中有正也有负或者0,虽然只要求一个最大积,但由于负数的存在,不但纪录最大乘积,也要记录最小乘积。利用动态规划来求解,用maxe原创 2016-07-14 21:49:24 · 2108 阅读 · 0 评论 -
树——找到二叉树中的最大二叉搜索树
题目给定一颗二叉树,已知其中所有节点的值都不一样,找到含有节点最多的二叉搜索树,并返回头节点。注:一个二叉树的子树的叶节点必须是该二叉树的叶节点。解答:以节点root为头的树中,最大的二叉搜索树只可能来自以下两种情况。1.如果来自root左子树上的最大ST以root.left为头,来自root右子树上的最大ST以root.right 为头,且左边BST的最大值小...原创 2016-07-15 20:23:39 · 1933 阅读 · 0 评论 -
构造数组的MaxTree
题目描述对于一个没有重复元素的整数数组,请用其中元素构造一棵MaxTree,MaxTree定义为一棵二叉树,其中的节点与数组元素一一对应,同时对于MaxTree的每棵子树,它的根的元素值为子树的最大值。现有一建树方法,对于数组中的每个元素,其在树中的父亲为数组中它左边比它大的第一个数和右边比它大的第一个数中更小的一个。若两边都不存在比它大的数,那么它就是树根。请证明这个方法的正确性,同时设原创 2016-07-15 16:39:33 · 571 阅读 · 0 评论 -
树——二叉树层序遍历
方法一:广度优先搜索(BFS),用一个辅助动态数组ArrayList,cur表示当前层结点个数,next表示下一层结点个数;若只需要打印某层结点,则只需再设一个变量表示层数即可。代码如下:import java.util.*;public class Solution { public void levelOrder(TreeNode root) { if(root...原创 2016-05-11 10:50:48 · 762 阅读 · 0 评论 -
树——由中序和前序,中序和后序序列重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。一、由前序和中序重构代码如下:/** * Definition for binary tree * public class TreeNode原创 2016-05-11 14:58:12 · 667 阅读 · 0 评论 -
树——按“之”字形打印二叉树(层序遍历变型)
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:用两个stack依次保存相邻的两层。代码如下:*public class TreeNode { int val = 0; TreeNode left = null; TreeNode righ原创 2016-05-11 10:41:33 · 1492 阅读 · 0 评论 -
回溯法——电话号码代表字符组合
题目描述Given a digit string, return all possible letter combinations that the number could represent.A mapping of digit to letters (just like on the telephone buttons) is given below.原创 2016-05-29 15:06:21 · 790 阅读 · 0 评论 -
String——替换空格
方法一:使用String的replaceAll方法。public class Solution { public String replaceSpace(StringBuffer str) { String string=str.toString(); return string.replaceAll(" ","%20"); }}方原创 2016-05-12 15:39:50 · 630 阅读 · 0 评论 -
未排序数组中累加和为给定值的系列问题
题目一:Zero Sum Subarray给定一整形数组,返回序列和为0的子数组的起始和结束下标。比如:int[] array={-3,1,2,-3,4}; 返回(0,2)和(1,3)。题解:使用hashmap保存数组中从0开始到索引i的子段和,在将值push进map之前,先检查map中是否已经存在,若存在则表示找到一组。注意:map中的键值对key原创 2016-07-21 12:18:39 · 1405 阅读 · 0 评论 -
归并排序应用——数组中的逆序对 and 计算数组的小和
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。public class Solution { public int InversePairs(int [] array) { if(array == null||array.length < 2) retu原创 2016-06-16 16:10:50 · 414 阅读 · 0 评论 -
边界都是1的最大正方形大小
题目:给定一个M*N的矩阵,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度。例如: [0, 1, 1, 1, 1], [0, 0, 1, 0, 1], [0, 1, 1, 0, 1], [0, 1, 1, 1, 1], [0,原创 2016-07-24 20:42:28 · 1302 阅读 · 0 评论 -
不要被阶乘吓倒
题目一求N!的末尾有多少个0?N!=1*2*3*...*(N-1)*N; 10的质数分解只有2和5,那么假设N!中通过质数分解,所能得到的2的个数为X,所能得到的5的个数为Y,则X和Y中较小的一个极为连乘中10的个数,也就得到了N!结果中末尾的0的个数。不难看出,X > Y在N!中是一定成立的,则问题转化为求Y。最简单的解法:int count=0;for(原创 2016-07-19 11:42:29 · 299 阅读 · 0 评论 -
二叉树中序遍历变型——折纸问题
题目描述请把纸条竖着放在桌子上,然后从纸条的下边向上方对折,压出折痕后再展 开。此时有1条折痕,突起的⽅向指向纸条的背面,这条折痕叫做“下”折痕 ;突起的方向指向纸条正面的折痕叫做“上”折痕。如果每次都从下边向上方对折,对折N次。请从上到下计算出所有折痕的方向。给定折的次数n,请返回从上到下的折痕的数组,若为下折痕则对应元素为"down",若为上折痕则为"up".测试样原创 2016-07-25 15:42:06 · 593 阅读 · 0 评论 -
动态规划——edit-distance 计算字符串的相似度
题目描述求两个字符串的编辑距离:具体操作方法为:a) Insert a characterb) Delete a characterc) Replace a character比如,对于“abcd”和"abcde"可以认为最少需要通过增加/减少一个'g'得到,则编辑距离为1。思路:若第一个字符是相同的,则考虑两个字符串从第二个原创 2016-05-23 19:30:58 · 476 阅读 · 0 评论 -
如何仅用递归函数和栈操作逆序一个栈
题目:一个栈依次压入1,2,3,4,5那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,而不能用另外的数据结构。解答:本题考察栈的操作和递归函数的设计,我们需要设计出两个递归函数。递归函数一:将栈stack的栈底元素返回并移除。 public int getAndRemoveLast(原创 2016-07-15 15:24:10 · 691 阅读 · 0 评论 -
和为s的连续正整数数列 and 未排序正数数组中和为s的最长子数组长度
题目一:输入一个正整数s,打印出所有和为s的连续正整数序列(至少有两个数)。两个下标small和big,可以看出small递增到s/2即可。import java.util.ArrayList;public class Solution { public ArrayList > FindContinuousSequence(int sum) { Arra原创 2016-07-23 22:20:51 · 473 阅读 · 0 评论