
数据结构
文章平均质量分 69
翁英健啊
博客用来打脸
展开
-
剑指offer面试题16-反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。保证链表不断是关键,用临时变量记录一些值。package com.aii.algorithm;public class ReverseLinkedList { /** * @return 返回倒转以后的链表的头 * */ public Node reverse(Node hea原创 2015-08-23 19:32:40 · 863 阅读 · 0 评论 -
从struts2的action中看ActionContext的存储结构
本篇将建立测试用例,在action中以打断点的形式查看ActionContext中的数据结构。不管多线程的情况,就以当前线程来说一、预先了解在ActionConext中,每一个线程都有一些数据存放在其中,那么是怎么存放的呢?在ActionContext类中有这么几行代码:Map context;public Map getContextMap() { return原创 2015-08-05 21:05:06 · 2455 阅读 · 1 评论 -
HashMap源码分析(四)put-jdk8-红黑树的引入
HashMapjdk8以后他的逻辑结构发生了一点变化:大概就是这个意思:当某一个点上的元素数量打到一定的阈值的时候,链表会变成一颗树,这样在极端情况下(所有的元素都在一个点上,整个就以链表),一些操作的时间复杂度有O(n)变成了O(logn)。分析源代码;一.还是先看下put方法,证明一下上面的图基本是对的: public V put(K key原创 2015-07-08 00:20:01 · 6776 阅读 · 0 评论 -
HashMap源码分析(二)get
有了之前put的基础,再看get的代码应该就很简单了 //获取指定key的值 public V get(Object key) { //key为null,执行getForNullKey方法 if (key == null) return getForNullKey(); //计算一下键的hash,以免就用这个来比较是不是一个k原创 2015-07-05 13:15:15 · 695 阅读 · 0 评论 -
HashMap源码分析(一)
//预先了解HashMap中元素的是以Entry的形式存在的,他是一个key value的封装类HashMap中的逻辑结构:链表数组??可以把他看做是一个数组,数组的每一个元素,可以是空,可以是单个元素,也可以是一个(单向)链表(的一头)逻辑结构基本是这样的:在插入元素的时候,首先要计算一下hash值,估计一下在数组层面,这个keyvalue得放在那个位置,然后判断这个位置上是不是“已原创 2015-07-05 01:03:15 · 704 阅读 · 0 评论 -
二叉树的先序-中序-后序遍历(一)-递归
这几天在复习算法,又遇到树的遍历。树的遍历递归比较简单;循环就比较麻烦了,看了别人的写法老是想不通是怎么做到的。今天静下心来想想,得出了自己的一套“白痴”的方案。--本篇先讲简单的---递归遍历。一、预备知识树的遍历方式:1.先序遍历:对于一个节点,1读本身,2读左子,3读右子。2.中序遍历:对于一个节点,1读左子,2读本身,3读右子。3.后序遍历:原创 2015-08-18 21:00:47 · 1148 阅读 · 0 评论 -
OgnlContext、OgnlValueStack、CompoundRoot的数据结构
在上一篇从struts2的action中看ActionContext的存储结构中已经看到ActionContext.getActionContext.getContextMap()得到的map的大体结构类型。这篇将从源代码层面进行分析。一、回顾在上一篇中看到ActionContext中存放的是OgnlContext这个类,这个类的源代码,在OgnlContext源码分析中已经将原创 2015-08-05 23:54:49 · 5371 阅读 · 3 评论 -
堆排序-java
堆的定义:对于所有的节点,均满足其子节点元素小于(大于)改节点元素的值根据根节点元素的大小,可以分为:小顶堆:节点的子元素比该节点元素要大。大顶堆:节点的子元素比该节点元素要小。堆排序的原理(以小顶堆为例):对于满足堆结构的数组,其最小的元素为根元素,即数组的第一个。在操作的时候,先从一个堆结构中取出最小的一个,与堆中最末尾的元素交换位置,将堆的容量减一,然后重构堆。原创 2015-07-18 18:03:04 · 694 阅读 · 0 评论 -
OgnlContext源码分析
1,首先明确OgnlContext是大概一个什么样的数据结构:public class OgnlContext extends Object implements Map能够看到他实现了Map接口,那么我们就用map的眼光去看待他。2,分析put方法刚开始就可以看到: if (RESERVED_KEYS.containsKey(key)) 2.1.RESER原创 2015-08-05 19:46:10 · 3066 阅读 · 1 评论 -
快速排序-java
1.快速排序采用分治的方法,将一个数组按一定的值划分比比他大的,比他小的两段,然后以这样的方式一直划分,直到每段的数量都小于2,这样就形成了一个有序的数组。2.具体排序时的操作可以想象成是一个“挖坑填数的操作”这里一升序排序为例,给定一个数组,我们的目标是将数组分为两组,一组比x大,一组比x小。1.挖出第一个数,用x记录当前这个数,这样第一个坑就被挖出来了,原创 2015-07-18 18:31:59 · 636 阅读 · 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 评论 -
剑指offer面试题13-在O(1)时间删除链表的节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。要想在O(1)时间搞定,绝对不能用遍历。这里采用将后面的一个节点复制到当前节点的方法。不过有特殊情况要考虑:1.如果要删除的节点没有下一个节点:则要找到上一个节点,并且将next设置为空,这个时候只能用遍历2.如果当前链表就一个节点由于java中没有指向指针的指针,所以用原创 2015-08-22 14:52:30 · 1168 阅读 · 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 评论 -
基数排序(Radix Sort)
基数排序是非比较排序算法,算法的时间复杂度是O(n). 相比于快速排序的O(nlgn),从表面上看具有不小的优势.但事实上可能有些出入,因为基数排序的n可能具有比较大的系数K.因此在具体的应用中,应首先对这个排序函数的效率进行评估.基数排序的主要思路是,将所有待比较数值(注意,必须是正整数)统一为同样的数位长度,数位较短的数前面补零. 然后, 从最低位开始, 依次进行一次稳定排序(我们常用上一转载 2015-09-06 12:43:48 · 814 阅读 · 0 评论 -
HashMap源码分析(三)hash
这个方法的移位太复杂,有些难看懂,就看看文档上是怎么说的: /** * Applies a supplemental hash function to a given hashCode, which * defends against poor quality hash functions. This is critical * because H原创 2015-07-05 14:16:22 · 1042 阅读 · 0 评论 -
剑指offer面试题40-数组中只出现一次的数字
题目:一个整形数组里除了两个数字意外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是On,空间复杂度为O1这个是上一篇 2016阿里巴巴java笔试题 的增强版...还是使用异或,异或到了最后得到结果是怎么样的呢?其余的数字都互相异或变成了0,所以最后的结果就是这2个不相同的数字的异或结果.就假定要找的两个数字为数字A和数字B原创 2015-08-31 13:51:26 · 2020 阅读 · 1 评论 -
剑指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面试题17-合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。这个和归并排序差不多,只要记录好指针,不要让链表断掉就行了。以及一些特殊情况的判断。package com.aii.algorithm;/** * 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。 * */public class MergeL原创 2015-08-23 19:32:59 · 953 阅读 · 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面试题24-二叉搜索树的后序遍历序列
题目:/* * 输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历的结果。 * 如果是则返回true,否则返回false。 * 假设输入的数组的任意两个数组都互不相同 * */既然是后序遍历,那么根元素肯定是在最后一个。又应该为二叉搜索树,所以左边一半的肯定比根要小,右边一半的比根要大。现在有了根,就可以把剩下的数组根据比根小与比根大的分割线分成两原创 2015-08-24 17:00:30 · 833 阅读 · 0 评论 -
剑指offer面试题14-调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。前后分的这个,,让我想起来快速排序,好吧,就用这个做。考虑到了排序的可扩展性,这里的判断条件设置为接口。package com.aii.algorithm;public class ArrayAdjuster { public void原创 2015-08-22 19:29:07 · 886 阅读 · 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面试题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面试题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面试题27-二叉搜索树转双向链表
题目:/*** 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。* 要求不能创建任何新的节点,只能调整树中节点指针的指向。* * */然后基本要实现的功能就是这样子的:怎么实现呢?看着像递归,就拿根节点来看:我要做两件事情:1.拿到左边树的最大的,让root.left=max,max.right=root2.拿到右原创 2015-08-25 17:53:25 · 751 阅读 · 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面试题29-数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5此,超过数组长度的一半,因此输出2分析:因为是这个数出现的次数比其他数出现次数的总和还多,所以可以考虑用栈做,用来两两抵消.如果碰到一样的,则加上,如果碰到与栈的末尾不一样,则弹出一个(抵消).这样到了最后,剩下原创 2015-08-30 16:56:22 · 864 阅读 · 0 评论 -
2016阿里巴巴java笔试题
题目:一个整形数组里除了一个数字出现3次以外,其他数字都出现2次.请写程序找出这个出现3次的数字.要求使用辅助空间O1,时间复杂度Onlogn.1.使用堆排序.(堆排序的时间复杂度为Onlogn)因为堆排序每次取到的都是最大(或是最小)的数字,三个相同的数字肯定是紧挨着被取出的.所以在原先的堆排序算法上,加2个标记记录即可.代码:// 使用堆排序,每次取原创 2015-08-31 13:24:57 · 2465 阅读 · 0 评论 -
二叉树的先序-中序-后序遍历(一)-循环----绝对白痴好记的方法
接着上一篇 二叉树的先序-中序-后序遍历(一)-递归 的讲,这篇该循环遍历了。之前一直没有找到好的方法来循环遍历树,以前我老认为有些递归的能做的东西很难换成循环实现。后来看了一些别人写的代码,然后又问了朋友,才发现。。。哦,原来这样的啊,我可以自己弄个栈来维护一下。想到了可以弄个栈以后,至少在我认为,把递归转成循环已经是可行的了,至于怎么实现,这几天在想(因为太笨,看人家的代码原创 2015-08-18 23:02:48 · 6641 阅读 · 2 评论