
算法题解-java
文章平均质量分 56
用java解决《剑指offer》中的算法题
翁英健啊
博客用来打脸
展开
-
剑指offer面试题40-数组中只出现一次的数字
题目:一个整形数组里除了两个数字意外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是On,空间复杂度为O1这个是上一篇 2016阿里巴巴java笔试题 的增强版...还是使用异或,异或到了最后得到结果是怎么样的呢?其余的数字都互相异或变成了0,所以最后的结果就是这2个不相同的数字的异或结果.就假定要找的两个数字为数字A和数字B原创 2015-08-31 13:51:26 · 2020 阅读 · 1 评论 -
剑指offer面试题29-数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5此,超过数组长度的一半,因此输出2分析:因为是这个数出现的次数比其他数出现次数的总和还多,所以可以考虑用栈做,用来两两抵消.如果碰到一样的,则加上,如果碰到与栈的末尾不一样,则弹出一个(抵消).这样到了最后,剩下原创 2015-08-30 16:56:22 · 864 阅读 · 0 评论 -
剑指offer面试题28-字符串的排列
题目:/*** 输入一个字符串,打印出该字符串中字符的所有排列。* 例如输入字符串abc,则打印出由字符串abc所能排列出来的所有字符串abc,acb,bca,cab和cba。* */这里用递归比较好:第一个是a,那么剩下的就问bc的排列有多少种第一个是b,剩下的问ac第一个是c,剩下的问ab那么方法就有了:当前这个数分别与他后面的数交换位置,然原创 2015-08-25 17:59:34 · 963 阅读 · 0 评论 -
剑指offer面试题27-二叉搜索树转双向链表
题目:/*** 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。* 要求不能创建任何新的节点,只能调整树中节点指针的指向。* * */然后基本要实现的功能就是这样子的:怎么实现呢?看着像递归,就拿根节点来看:我要做两件事情:1.拿到左边树的最大的,让root.left=max,max.right=root2.拿到右原创 2015-08-25 17:53:25 · 751 阅读 · 0 评论 -
剑指offer面试题25-二叉树中和为某一值的路径
题目:输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。其实就是树的遍历。在遍历的同时记录下来轨迹。打印的时候需要查看轨迹:从头到尾往下走的时候需要往轨迹的末尾加:往上反的时候需要往轨迹的末尾减:所以这里使用LinkedList把。。树的定义如下:pack原创 2015-08-24 22:27:24 · 811 阅读 · 0 评论 -
剑指offer面试题26-复杂链表的复制
题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每一个节点除了一个m_pNext指针指向下一个节点外,还有一个m_pSibling指向链表中的任意节点或者NULL,节点的定义如下:package com.aii.algorithm;public class Node { int原创 2015-08-24 23:03:59 · 974 阅读 · 0 评论 -
剑指offer面试题24-二叉搜索树的后序遍历序列
题目:/* * 输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历的结果。 * 如果是则返回true,否则返回false。 * 假设输入的数组的任意两个数组都互不相同 * */既然是后序遍历,那么根元素肯定是在最后一个。又应该为二叉搜索树,所以左边一半的肯定比根要小,右边一半的比根要大。现在有了根,就可以把剩下的数组根据比根小与比根大的分割线分成两原创 2015-08-24 17:00:30 · 833 阅读 · 0 评论 -
剑指offer面试题23-从上往下打印二叉树
题目: 从上往下打印出二叉树的每个节点,每一层的节点展昭从左到右的顺序打印。就是树的广度遍历。用队列,把树的子节点放到队列中。public class BinaryTreeNode { Integer value; BinaryTreeNode left; BinaryTreeNode right; public BinaryTreeNod原创 2015-08-24 16:36:16 · 953 阅读 · 0 评论 -
剑指offer面试题21-包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push,pop的时间复杂度都是O(1)public class StackWithMin { private Stack stack = null; private Stack minStack = null; public StackWithMin() { st原创 2015-08-24 16:31:12 · 761 阅读 · 0 评论 -
剑指offer面试题20-顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。如:1-2-3-45-6-7-89-10-11-1213-14-15-16的矩阵,打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.一个二维数组,打印的第一轮的起点肯定是(0,0),第二轮(如果有的话)起点为(1,1)。那第n轮肯定就是(n原创 2015-08-24 16:25:58 · 1053 阅读 · 0 评论 -
剑指offer面试题18-树的子结构
题目:输入两颗二叉树A和B,判断B是不是A的子结构。树的结构如下:package com.aii.algorithm;public class TreeNode { int value; TreeNode left; TreeNode right; public TreeNode(int value) { this.value = value; }}全原创 2015-08-23 20:15:05 · 1116 阅读 · 0 评论 -
剑指offer面试题17-合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。这个和归并排序差不多,只要记录好指针,不要让链表断掉就行了。以及一些特殊情况的判断。package com.aii.algorithm;/** * 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。 * */public class MergeL原创 2015-08-23 19:32:59 · 953 阅读 · 0 评论 -
剑指offer面试题16-反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。保证链表不断是关键,用临时变量记录一些值。package com.aii.algorithm;public class ReverseLinkedList { /** * @return 返回倒转以后的链表的头 * */ public Node reverse(Node hea原创 2015-08-23 19:32:40 · 863 阅读 · 0 评论 -
剑指offer面试题15-链表中倒数第k个节点
题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如一个链表有6个节点,从头结点开始他们的值依次是1、2、3、4、5、6,这个链表的倒数第3个节点的是值为4的节点。比较好的方法就是用2个指针:一前以后,前后相差n-1,当前面的指针到了最后一个,后面的那个指针刚好指向我们要的那个对象。packa原创 2015-08-22 21:17:33 · 765 阅读 · 0 评论 -
剑指offer面试题14-调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。前后分的这个,,让我想起来快速排序,好吧,就用这个做。考虑到了排序的可扩展性,这里的判断条件设置为接口。package com.aii.algorithm;public class ArrayAdjuster { public void原创 2015-08-22 19:29:07 · 886 阅读 · 0 评论 -
剑指offer面试题12-打印1到最大的n位数
题目:输入一个数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3最大的三位数即999这道题的主要陷阱就在大数的处理,只要将这个考虑进去,用字符串来表示,就好说了。那差不多代码是这样子的:public void print1(int n) { if (n < 0) { throw new RuntimeException();原创 2015-08-22 15:51:41 · 1275 阅读 · 0 评论 -
剑指offer面试题13-在O(1)时间删除链表的节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。要想在O(1)时间搞定,绝对不能用遍历。这里采用将后面的一个节点复制到当前节点的方法。不过有特殊情况要考虑:1.如果要删除的节点没有下一个节点:则要找到上一个节点,并且将next设置为空,这个时候只能用遍历2.如果当前链表就一个节点由于java中没有指向指针的指针,所以用原创 2015-08-22 14:52:30 · 1168 阅读 · 0 评论 -
Singleton的三种形式+怎么实现真正的单例
以前用singleton的时候就接触过饿汉懒汉两种最近书上看到一个对于我来说是新的方法,感觉还是很不错的这里将三种方法放一起,比较总结一下一、饿汉式package com.aii.algorithm;public class HungrySingleton { private HungrySingleton() { } private static Hungr原创 2015-08-19 19:57:06 · 1160 阅读 · 0 评论 -
剑指offer面试题5-从尾到头打印链表/6-重建二叉树
题目5:对于一个单链表,已知他的头结点,要求从尾到头打印里面的内容。思路:手上有头,要从尾到头打印,首先想到的是栈。想到了栈,真要去实现,发现有一个更巧的方法,同样是栈--递归。public static void printLinkedListFromTail(Node node) { if (node != null) { printLinkedLis原创 2015-08-19 00:18:55 · 785 阅读 · 0 评论 -
剑指offer面试题3-二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该函数: public boolean find(int[][] args,int key){ if(args==null ) throw new IllegalArgumentException(); int l原创 2015-04-28 00:08:34 · 961 阅读 · 0 评论