剑指offer(java)
baidu-liuming
机器学习 深度学习 大数据 自然语言处理 linux python shell hive 算法
展开
-
java实现链表反转
-Node.Java -LinkList.java -Main.javaNode.java源码public class Node{ public int data; public Node next; public Node(int data){ this.data = data; this.next = null; }}Li转载 2017-07-13 17:23:21 · 490 阅读 · 0 评论 -
剑指offer-二叉树镜像
题目:操作给定的二叉树,将其变换为源二叉树的镜像。 思路:最简单的一类递归问题,从根节点开始交换左右子节点。public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.va...原创 2018-04-09 19:37:53 · 157 阅读 · 0 评论 -
剑指offer-顺时针打印矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路:呈环形打印矩阵,注意行矩阵和列矩阵的情况public ArrayList<Integer> prin...原创 2018-04-09 20:40:16 · 146 阅读 · 0 评论 -
剑指offer-栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 思路:设置临时变量index指向弹出序列popA的第一个元素,遍历压入序列pushA的元素进...原创 2018-04-09 21:58:38 · 214 阅读 · 0 评论 -
剑指offer-按行打印二叉树
题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路 借助队列,首先将链表头节点放入队列中,判断队列的头节点是否有左右子节点,如果有放入队列中,...原创 2018-04-10 15:35:38 · 464 阅读 · 0 评论 -
剑指offer-二叉搜索树的后序遍历序列
题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路 后序遍历序列的最后一个元素为当前子树的根节点,根节点大于左子树的所有元素,小于右子树的所有元素。若当前序列不满足上一条件则返回false,若满足上述条件,继续遍历左子树和右子树序列是否为后序遍历序列。public class S...原创 2018-04-10 16:43:03 · 140 阅读 · 0 评论 -
剑指offer - 二叉树中和为某一值的路径
题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路 借助ArrayList< ArrayList < Integer >>结构,存储多条路径。假设内部子链表为innerList,外部链表arrayList。 1.若当前遍历的节点为空,直接返回arrayList;若当...原创 2018-04-10 20:40:20 · 149 阅读 · 0 评论 -
剑指offer-反转链表
输入一个链表,反转链表后,输出链表的所有元素。 链表结构public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}算法思路: 1. 若链表空,直接返回头结点 2. 若链表不为空,设置pre, cur, ...原创 2018-03-28 15:56:25 · 143 阅读 · 0 评论 -
剑指offer-从尾到头打印链表
输入一个链表,从尾到头打印链表每个节点的值。 链表结构:public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}思路:借助栈为“先进后出”的结构,初始化新的链表,首先判断原链表是否为空,若为空直接返回新链表头...原创 2018-03-28 16:34:46 · 211 阅读 · 0 评论 -
剑指offer-二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思想:假设该数的大小为n,若n为0,则n的二进制中1的个数为0; 若n不为0,则n的二进制中必含有1; n-1的二进制表示,实际上是将n中最右边1的位置iii二进制置为0,iii右边所有元素置为111,即将最右边1的位置及其后续元素取反 n&(n-1):表示将n最右边的1置为0,实际上就是删除了一个1,那...原创 2018-04-03 16:26:34 · 234 阅读 · 0 评论 -
剑指offer-重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路:已知前序遍历和中序遍历求解二叉树 当前子树的前序遍历头结点为二叉树的根节点,在中序遍历序列中,根节点元素的左边序列为左子树节点,右序列为右子树...原创 2018-04-03 16:13:55 · 139 阅读 · 0 评论 -
剑指offer-替换空格
题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 思路:将字符串转换成字符数组,逐个遍历字符数组,若遇到空格,则替换 public String replaceSpace(StringBuffer str) { char[] charArray = ...原创 2018-04-03 11:31:20 · 119 阅读 · 0 评论 -
剑指offer-二维数组查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路: 1. 判断矩阵是否为:null、{}、{{}}这三种情况,若为三种情况的一种,则直接返回false; 2. 因矩阵是从左到右,从上到下逐步递增的。以矩阵的左下角为初始点,若目标值小于初始节点,则向上遍历;若...原创 2018-04-03 10:46:57 · 135 阅读 · 0 评论 -
剑指offer - 二叉搜索树与双向链表
题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路 二叉搜索树的左子树的根节点小于中间节点,右子树的根节点大于中间节点;因此,可以参考中序遍历,遍历二叉树。 1.设置两个变量head和realHead,head存储当前子树的根节点,readHead存储二叉树拥有最小节点值的节点,(二叉搜索树中序遍历的第一个节点)。...原创 2018-04-11 11:37:16 · 144 阅读 · 0 评论 -
斐波那契数列--动态规划版
斐波那契数列,n=0开始:0, 1, 1, 2, 3, 5…… 暴力方法 public int Fibonacci(int n) { if(n <= 0) return 0; if(n == 1) return 1; return Fibonacci(n-1) + Fibonacc...原创 2018-04-04 15:33:37 · 412 阅读 · 0 评论 -
剑指offer-树的子结构
题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 思路:将原始问题分为两个子问题 a. 在树A中寻找和树B根节点的值一样的结点R b. 判断在树A中以R为根节点的子树,是否和树B拥有一样的结构 树结构:public class TreeNode { int val = 0; TreeNode left = null; ...原创 2018-04-08 22:00:58 · 154 阅读 · 0 评论 -
剑指offer-合并两个有序链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路:假设两链表分别为list1和list2,若一个为空,则返回另外一个链表的头结点。若两个都不为空,设置head和curNode两个变量,head记录头节点,curNode记录当前节点。按照两链表的值的大小更新当前curNode。 链表结构:public class ListNode ...原创 2018-04-08 19:46:38 · 358 阅读 · 0 评论 -
剑指offer - 链表中倒数第k个节点
题目:输入一个链表,输出该链表中倒数第k个结点。 思路:设置该链表的两个指针指向头节点,第一个指针先走到第k个节点; 然后两个指针往后走,先走的指针走到最后一个,第二个指针指向第k个节点。 边界检查:a. 链表为空 b. k为0或k的长度大于链表的长度。/*public class ListNode { int val; L...原创 2018-04-08 15:18:13 · 238 阅读 · 0 评论 -
丑数
题目描述把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。分析:根据丑数的定义,丑数只能被2、3和5整除。也就是说如果一个数如果它能被2整除,我们把它连续除以2;如果能被3整除,就连续除以3;如果能被5整除,就除以连续5。如果最后我们得原创 2017-07-13 21:11:20 · 245 阅读 · 0 评论 -
二叉树求深度的递归的详细分析
二叉树求深度的递归的详细分析二叉树求深度递归算法源码》数据结构:typedef struct BINODE{ TELEMETYPE data; struct BINODE *lchild,*rchild;}BiNode,*BiTtree;》递归函数int GetTreeDeep(BiTtree T) //计算二叉树的深度{ if(T==N转载 2017-07-14 09:47:47 · 11660 阅读 · 3 评论 -
二进制中的1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2.1、可能引起死循环的解法这是一道很基本的考察二进制和位运算的面试题。题目不是很难,面试官提出问题之后,我们很快形成一个基本的思路:先判断证书二进制表示中最右边一位是不是1.接着把输入的证书右移一位,此时原来处于从右边树起的第二位被移到最后一位,再判断是不是1转载 2017-07-14 15:11:16 · 212 阅读 · 0 评论 -
JAVA实现二维数组中的查找(《剑指offer》)
最近在刷《剑指offer》里的编程题,但是网上关于《剑指offer》的解答多半是C或者C++的,而且官方(作者)也是在用C++进行讲解,这里自己用java写了一些题目的解答代码(当然也有部分是借鉴了网上别人的解答的,出处未注明敬请之处请指出,侵删),希望能对大家的学习有所帮助。题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样转载 2017-07-14 16:25:26 · 445 阅读 · 0 评论 -
《剑指Offer》替换空格(将字符串中的空格替换为%20)
题目: 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为 We Are Happy.则经过替换之后的字符串为 We%20Are%20Happy。思路:这种替换问题要考虑是否会覆盖原字符串,若是在源字符串上直接替换。看到这个问题我觉得很多人都会想到直接从头开始替换,即遇到空格就将其替换为%20,每次都要将空格后的字符后移两个字节。这种解法的时间复杂度为O(n^2)!!!另外转载 2017-07-15 21:01:14 · 420 阅读 · 0 评论 -
Java判断单链表是否有环的两种实现方法
http://blog.jobbole.com/106227/ 方法一:首先从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比较。如果发现新节点之前的所有节点当中存在相同节点ID,则说明该节点被遍历过两次,链表有环;如果之前的所有节点当中不存在相同的节点,就继续遍历下一个新节点,继续重复刚才的操作。例如转载 2017-07-16 11:24:42 · 1172 阅读 · 0 评论 -
JAVA实现重建二叉树(《剑指offer》)
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 Definition for binary tree public class TreeNode { int val;转载 2017-07-16 17:09:30 · 228 阅读 · 0 评论 -
剑指offer:跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:第n阶只能是从第n-1阶或从第n-2阶跳上来的。public class Solution { /*采用递归,时间耗时过多,于是考虑迭代解决*/ public int JumpFloor(int target) { if(target<0){原创 2017-07-16 17:59:07 · 227 阅读 · 0 评论 -
剑指Offer面试题9(java版)斐波那契数列
题目一:写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下:1、效率很低效的解法,挑剔的面试官不会喜欢很多C语言的教科书在讲述递归函数的时候,都户拿Fibonacci作为例子,因此很多的应聘者对这道题的递归解法都很熟悉。下面是实现代码我们教科书上反复用这个问题来讲解递归的函数,并不能说明递归的解法最适合这道题目。面试官会提示我们上述递归的解法有很严重的效率问题要求我们分析原因转载 2017-07-16 23:12:21 · 325 阅读 · 0 评论 -
JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作(《剑指offer》)
最近在刷《剑指offer》里的编程题,但是网上关于《剑指offer》的解答多半是C或者C++的,而且官方(作者)也是在用C++进行讲解,这里自己用Java写了一些题目的解答代码(当然也有部分是借鉴了网上别人的解答的,出处未注明敬请之处请指出,侵删),希望能对大家的学习有所帮助。题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。转载 2017-07-29 20:10:04 · 413 阅读 · 0 评论 -
二分快速幂
对于a^b,普通的求法是用一个循环一直乘b个a,这样的方法对于某些题目来说可能显得比较慢。二分快速幂是一种利用b的二进制特征来快速求a^b的算法。例如:a = 2, b = 35则b的二进制表示形式为100011则 a^b = (2^32) * (2^2) * (2^1)有了这样的思路之后,就不用循环b次了。假设b的二进制表示有n位,从后往前转载 2017-07-30 09:46:40 · 347 阅读 · 0 评论 -
剑指offer-两个栈实现队列
题意:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 思路: 栈的特点:后进先出 队列的特点:先进先出; 入队:直接进入stack1中; 出队:若stack2不为空,将stack2的元素直接出栈; 若stack2为空,将stack1中的所有元素压入stack2**(只有这样才能保证先进先出结构)**,然后从stack2中出栈一个元...原创 2018-04-07 17:13:30 · 135 阅读 · 0 评论 -
剑指offer-旋转数组最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路:若数组的长度大于等于2,最小的数字一定比前一个小;并处理掉数组为空和数组长度为1的时候。publi...原创 2018-04-07 17:31:09 · 316 阅读 · 0 评论 -
LeetCode50:二分快速幂
题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路:应概率到幂次有正有负public double Power(double base, int exponent) { if(exponent == 0){ return 1; } int exp...原创 2018-04-07 18:41:14 · 277 阅读 · 0 评论 -
leetcode70: 跳台阶动态规划版
跳台阶一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:第一步可以跳1级或2级 a. 第一步跳1级, 剩下n-1级;跳法为 f(n - 1) b. 第一步跳2级,剩下 n-2级;跳法为f(n - 2) 由a、b假设可以得出总跳法为: f(n) = f(n - 1) + f(n -2)public int JumpFloor(int...原创 2018-04-05 20:24:41 · 1511 阅读 · 0 评论