
剑指offer编程题
剑指offer经典编程题的java代码
中都
风习袅袅,盈水展千华,飞檐亭角清铃响;犹记当初,你回眸莞尔,一笑倾城百日香。!
展开
-
1~n整数中1出现的次数
资料原创 2019-01-30 17:49:07 · 408 阅读 · 0 评论 -
数字序列中某一位的数字
/** * 得到第index位数主方法 * @param index * @return */ public static int get_number(int index) { if(index < 0) { return -1; } int digits = 1...原创 2019-01-30 16:46:54 · 517 阅读 · 0 评论 -
n个骰子的点数
思路:一个骰子有6个面,点数分别是1,2,3,4,5,6,那么n个骰子的最小点数和为n,最大点数和为6n;1、当只有一枚骰子时,它只有6种结果,即和为1,2,3,4,5,6这6种,抛一次骰子时每种结果都只可能会出现1次;2、当有n枚骰子时,抛一次时的最小点数和为n,最大点数和为6n,其他的点数和在这之间,当求点数和为k(n<k<6n)的出现次数,那f(k) = f(k-1)+f(...原创 2019-01-30 12:18:10 · 2343 阅读 · 0 评论 -
约瑟夫环
问题描述:一圈人(n个)围着一起报数,报到x的淘汰,规定最后场上剩下的y人为胜利者。 /** * 约瑟夫环,用数组方法解决 * @param personNumber 总人数 * @param number 报到就淘汰的数字 * @param survive 最后需要留的人数 */ public st...原创 2018-10-30 01:33:58 · 317 阅读 · 0 评论 -
构建乘积数组
import java.util.Arrays;/** * @ClassName TestDemo66 * @Description 面66 * @Author lzq * @Date 2019/1/29 13:17 * @Version 1.0 **/public class TestDemo66 { public static void main(String[] a...原创 2019-01-29 13:41:34 · 215 阅读 · 0 评论 -
树中两个节点的最低公共祖先
以下几个方法中会用到的方法和类:class BinaryTreeNode { int data; BinaryTreeNode left; BinaryTreeNode right; BinaryTreeNode parent; public BinaryTreeNode(int data) { this.data = data; ...原创 2019-01-29 13:01:38 · 398 阅读 · 0 评论 -
根据前序、中序遍历结果重建二叉树
如果已知一个二叉树的前序、中序遍历结果,要重建一个二叉树,步骤如下:例:二叉树的前序遍历结果:{1,2,4,7,3,5,6,8};中序遍历结果:{4,7,2,1,5,3,8,6};我们知道树的前序遍历第一个数就是根节点,而在中序遍历中,前面是左子树,中间是根节点,后面是右子树,于是对于这个二叉树:1、根节点:12、左子树(就是在中序遍历中找到根节点,前面的数就是左子树的所有节点):中序...原创 2018-12-25 14:02:29 · 787 阅读 · 0 评论 -
二叉树的下一个节点
问题描述:给定一个二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点,树中的节点属性是:数据、指向左子节点、指向右子节点、指向父节点的指针;例:中序遍历:现在我们来分析如何找到给定的二叉树的节点下一个节点:1、如果当前给定的节点有右子树,那么下一个节点就是它的右子树中的最左节点,也就是说,从当前给定的节点的右子节点出发,一直沿着指向左子节点的指针,我们就能找到它的下一个节点;...原创 2018-12-26 13:09:20 · 665 阅读 · 0 评论 -
表示数值的字符串
题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如字符串“+100”、“5e2”、“-123”、“3.1416”、“-1E-16”都表示数值但“12E”、“1a3.14”、“1.2.3”、“±5”、“12e+5.4”都不是数值;表示数值的字符串遵循以下两种模式:①A.BeC或者A.BEC;②.BeC或者.BEC,其中,A表示数值的整数部分,B在小数点后面表示小数部...原创 2019-01-01 19:03:38 · 622 阅读 · 0 评论 -
树的子结构
题目描述:输入两个二叉树A和B,判断B是不是A的子结构;思路:①在树A中找到和树B的根节点值一样的节点R;②判断树A中以R为根节点的子树是不是包含树B一样的结构;注意:double值比较值是否相等时,不能直接写 == 去判断,因为在计算机内表示小数时(包括float和double型小数)都有误差,判断两个小数是否相等,只能判断他们之差的绝对值是不是在一个很小的范围内,如果这两个数相差很...原创 2019-01-02 16:26:10 · 267 阅读 · 0 评论 -
复杂链表的复制
题目描述:请实现一个函数复制复杂链表,在复杂链表中,每一个节点除了有一个指向下一个节点的next指针,还有一个指向链表中任意一个节点或为空的p指针;最好的方法如下:①把链表的每一个节点都clone一次,并将clone的节点连接在原来相应的节点后面;②把原来p指针不为空的节点找出来,将对应的clone的节点的p指针指向原节点的p指针指向的节点后面的节点;③将两个链表拆开;class...原创 2019-01-04 21:33:38 · 317 阅读 · 0 评论 -
二叉搜索树与双向链表
题目描述:输入一颗二叉搜索树,将该二叉树转换成一个排序的双向链表,要求不能创建任何一个新的节点,只能调整节点中的指针;代码:剑指offer上的方法: static BinaryTreeNode node = null; public static BinaryTreeNode Convert(BinaryTreeNode root) { ConvertNod...原创 2019-01-05 19:30:22 · 310 阅读 · 0 评论 -
序列化二叉树
题目描述;请实现两个函数,一个用来序列化二叉树、一个用来反序列化二叉树; StringBuffer stringBuffer = new StringBuffer(); /** * 序列化二叉树 * @param root */ public void Serialize(BinaryTreeNode root) { if(...原创 2019-01-05 20:44:51 · 910 阅读 · 0 评论 -
字符串的全排列和组合
字符串的全排列/** * @ClassName TestDemo37 * @Description 面38 全排列 * @Author lzq * @Date 2019/1/5 20:54 * @Version 1.0 **/public class TestDemo37 { public static int count = 0; //记录排列的种树 /**...原创 2019-01-06 01:53:29 · 1226 阅读 · 3 评论 -
不能用排序、求一个数组第k大的数字、时间复杂度为O(nlog₂k)
思想:既然不能用排序还要求数组第k大的数字,时间复杂度为O(nlog₂k),那么我们可以用快速排序的思想,因为快速排序每次都会确定待排序数组的一个基准在数组中合适的位置,那么只要我们得到一个基准的排序后位置下标等于k-1,那么这个位置的数字就是我们要找的这个数字;public class TestDemo6 { public static void main(String[] args...原创 2019-01-14 21:44:15 · 1069 阅读 · 0 评论 -
数据流中的中位数
题目:如何找到一个数据流中的中位数?如果从数据流中读取到奇数个数值,那么中位数就是所有数值排序之后位于中间的数值,如果从数据流中读取到偶数个数值,那么中位数就是排序之后位于中间两个数的平均值;最好的时间复杂度解决思路:使数据在容器中已经排序,并且让容器左边的数据比右边的小,这样中位数就是左边的最后一位数或者是左边的最后一位数和右边的第一位数的平均值,要实现让容器左边的数据都比右边的小,可以...原创 2019-01-22 09:29:17 · 532 阅读 · 0 评论 -
把数组排成最小的数
题目:输入一个正整数数组,把数组里面的数字拼接起来排成一个数,打印能拼接出的所以数字的最小的一个,例如,输入数组{3,32,321},则打印出这三个数字能拼成的最小数字321323;/** * @ClassName TestDemo45 * @Description 面45 * @Author lzq * @Date 2019/1/22 10:14 * @Version 1.0 *...原创 2019-01-22 11:02:18 · 263 阅读 · 0 评论 -
第一个只出现一次的字符
题目一:字符串中只出现一次的字符,在字符串中找到第一个只出现一次的字符,如输入"abaccdeff",则输出“b”; /** * 面50 * @param str * @return */ public static char find(String str) { if(str == null || str.length() ...原创 2019-01-23 16:25:14 · 257 阅读 · 0 评论 -
数组中的逆序对
题目:在数组中的两个数字如果前面的数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如在数组{7, 5, 6, 4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(7,4)、(6、4)和(5,4)。解决方法:用递归排序思想:import java.util.Arrays;/** * @ClassName TestDemo51...原创 2019-01-24 11:25:28 · 308 阅读 · 0 评论 -
把字符串转化成整数
/** * @ClassName TestDemo67 * @Description 面67 * @Author lzq * @Date 2019/1/24 15:58 * @Version 1.0 **/public class TestDemo67 { //非法输入,默认false(即没有非法输入) public boolean illegality = fals...原创 2019-01-26 11:50:41 · 586 阅读 · 0 评论 -
判断一棵树是不是平衡二叉树
引用两种方法都要求树的深度,所以首先,求树的深度的方法如下: / * 求树的深度 * @param root * @return */ public static int TreeDepth(BinaryTreeNode root){ if(root == null) { return 0; ...原创 2019-01-27 14:22:29 · 1102 阅读 · 0 评论 -
队列的最大值
效率比较高的做法:使用双向队列(,队列中只存放当前元素的下标,设新来的元素为k,如果前面的元素比k小,直接把前面的删除(因为不可能成为后面窗口的最大值),如果前面的元素比k大,判断是否还在窗口范围内,不在则移除①先判断当前队列是否为空,如果不空而且当前元素比队列中尾端的元素大,将队列元素的尾端弹出;②判断队列头元素(存的是下标)是否还在滑动窗口范围中,不在则把头元素移除; /** ...原创 2019-01-27 17:56:43 · 1013 阅读 · 0 评论