java
文章平均质量分 54
KesarChen
一个偏执于计算机的宅男。。。。
展开
-
[算法学习]给定一个整型数组,找出两个整数为指定整数的和(2)
问题描述:给定一个整型的数组,找出其中的两个数使其和未指定的值,返回两个数的数组下标(假定是无序数组,数组元素各不相同,要求时间复杂度为O(n),n为数组长度,可以使用辅助空间) 分析:时间复杂度是O(n),即是扫描一遍数组,不可嵌套扫描。必须全部数组扫描和查找全部,扫描+查找=O(n),可以使用数据结构哈希表,哈希表的查找的时间复杂度是O(1)。理一理代码思路(1). 因为输出是数组下原创 2016-01-28 14:06:42 · 10596 阅读 · 1 评论 -
[算法学习]求出链表中倒数第n个节点
问题描述: 求出链表中倒数第n个节点。例如:1,2,3,4,5,倒数第2个是4 解法与分析: 用两个指针的方法。 1. 第一个指针起始位置在0位置,第二个指针起始位置在n-1位置。 2. 两个指针同时移动,每次移动1个结点。 3. 当第二个指针移动到最后一个节点时,第一个指针所指结点就是倒数第n个结点。参考代码如下static class ListNode{原创 2016-02-18 13:55:19 · 8766 阅读 · 0 评论 -
[算法学习]判断链表是否是环结构
问题描述: 判断链表是否是环结构。 解法与分析: 用两个指针的方法判断。 1. 第一个指针在第一个结点,第二个指针在第二个结点处; 2. 两个指针同时移动,第一个指针每次移动一个结点,第二个指针每次移动两个结点; 3. 当第二个指针和第一个指针指向的结点是同一个时,链表有环。参考代码如下static class ListNode{ int val; L原创 2016-02-18 13:54:34 · 7504 阅读 · 0 评论 -
[算法学习]合并两个排序的链表
问题描述: 合并两个排序的链表。解法一:用递归 解法: 递归比较结点大小:每次递归,取出两个链表的头结点来比较,比较小的结点加入新链表中。参考代码如下/** * 用递归 * @param head1 * @param head2 * @return */public static ListNode merge(ListNode head1, ListNode head2){原创 2016-02-18 13:53:35 · 7392 阅读 · 1 评论 -
[算法学习]反转链表
问题描述: 输入一条链表,将链表反转后返回。解法一:用递归 解法: 由于反转后头结点会成为尾结点,尾结点会成会头结点。所以从头结点开始反转前后结点关系。比较简单,所以这里直接贴出代码。参考代码如下/** * 递归 * @param head * @return */public static ListNode reverseList1(ListNode head){ if原创 2016-02-18 13:52:54 · 7386 阅读 · 0 评论 -
[算法学习]计算出二进制数中1的个数
问题描述: 计算出二进制数中1的个数。解法一:循环计数 解法与分析: 使用一个数1来“与”二进制数中每一位,若值为1则1的个数加一。参考代码如下/** * 通过flag左移做一个循环来与num的每一位,若与计算的结果不为0,则1的个数++ * @param num * @return */public static int calc2(int num){ int coun原创 2016-02-18 13:52:00 · 7911 阅读 · 0 评论 -
[算法学习]栈中的最小值
问题描述: 实现栈的pop、push、 min (得到栈中最小值)方法。 解法与分析: 1. 由于每次压栈和出栈都可能会改变栈中的最小值,所以,我们增加一个存放最小值的栈。 2. 当出栈操作时,最小值的栈也出栈;(当然,必须判断栈是否为空) 3. 当压栈操作时,比较压栈元素值和最小栈的栈顶元素的大小,若比较小,则将它压入栈中,若不是,则将最小栈的栈顶元素重复压栈。(当然原创 2016-02-18 13:51:19 · 8408 阅读 · 0 评论 -
[算法学习]栈的出栈序列
问题描述: 输入数字不重复的两组整数序列:压栈的序列A,出栈的序列B,验证AB是否为同一栈的序列。 解法与分析: 1. 使用两个指针pA,pB分别在两个序列A,B上遍历。 2. 做个这样的判断,首先判断两个指针所指元素是否相等,若相等,则两个指针同时推进;若不相等,取出栈顶元素作比较;若与栈顶元素不相等,则序列A的元素入栈,pA指针向前推进,若与栈顶元素相等,则出栈,pB指针原创 2016-02-18 13:50:39 · 9708 阅读 · 0 评论 -
[算法学习]二叉搜索树转双向链表
问题描述: 将一棵二叉搜索树转成一条排序好的双向链表。要求不能创建新结点。 解法与分析: 1. 由于左子树<根结点<右子树,所以双向链表的头结点是二叉搜索树左子树中的最后一个左结点,双向链表的头结点是二叉搜索树右子树中的最后一个右结点,根结点则是链表的中间结点。 2. 将树结点中指向左孩子的指针作为双向链表中的前驱指针,指向右孩子的指针作为双向链表指向后继结点的指针。原创 2016-02-18 13:49:50 · 7322 阅读 · 0 评论 -
[算法学习]打印树的路径
问题描述: 输入一个整数sum和一棵二叉树,打印出二叉树中结点和为sum的所有路径。 (路径:从根结点往下一直到叶结点形成的一条路径。) 解法与分析: 1. 需要从树上的根结点遍历到叶子结点,其中需要累加经过结点的值。 2. 当累加到叶子结点时,比较累加结点值和sum的值,如果相等,打印出路径;如果不相等,返回到上一层,寻找其他叶子结点。 3. 需要保存结点路径,还可以原创 2016-02-18 13:48:59 · 8655 阅读 · 0 评论 -
[算法学习]树的子结构
问题描述: 判断树A是否是树B的子结构。 解法与分析: 使用递归的方式很容易解决。先进行根结点比较,相等的话,递归左右子树。参考代码如下public static boolean isIncludeTree(TreeNode parent, TreeNode child){ boolean result = false; if (parent == null || c原创 2016-02-18 13:47:26 · 6986 阅读 · 0 评论 -
[算法学习]树的镜像
问题描述: 输出树的镜像。 解法与分析: 根结点不变,左右子树交换。按照这一点进行递归,就可以解决问题。参考代码如下public static TreeNode mirror(TreeNode root){ if(root==null) return null; TreeNode left=root.left; TreeNode right=root.right原创 2016-02-18 13:46:15 · 6453 阅读 · 0 评论 -
[java学习]java容器源码初探(1)
一、动态数组ArrayList 在我们开发者眼中,这就是一个“动态数组”,可以“动态”地调整数组的大小,虽然说数组从定义了长度后,就不能改变大小。 实现“动态”调整的基本原理就是:按照某个调整策略,重新创建一个调整后一样大小的数组,然后将原来的数组赋值回去。 下面我们来解析一下几个与数组不一样的方法。看看ArrayList中主要的几个字段(源码剖析): // 默认的初始数组大原创 2016-03-15 18:44:26 · 3290 阅读 · 0 评论 -
[算法学习]求链表的中间结点
问题描述: 返回链表的中间结点(如果是两个则返回两个) 解法与分析: 用两个指针移动的方法来解决问题。一个指针每次移动1个结点,另外一个指针移动2个结点。参考代码如下static class ListNode{ int val; ListNode next; public ListNode(int val) { this.val = va原创 2016-02-18 13:56:00 · 7617 阅读 · 0 评论 -
[算法学习]复杂链表的复制
问题描述: 复制一个复杂链表。 在复杂链表中,每个结点除了有一个指向下一个结点的next指针外,还有一个 sibing指针 指向链表中任意结点或者NULL。解法一:“爆破” 解法分析: 1. 遍历第一遍数组,把复制链的next和各结点值复制好。需要时间O(n) 2. 第二遍遍历,二重for循环根据原链表,将复制链的slibing指针连接好。需要时间O(n^2) 3. 需要时原创 2016-02-18 13:56:50 · 7100 阅读 · 0 评论 -
[读书笔记]Java类加载器
一、类与类加载器类加载器除了在类加载阶段的作用外,还确定了对于一个类,都需要由加载它的类加载器和这个类本身一同确定其在Java虚拟机中的唯一性。通俗一点来讲,要判断两个类是否“相等”,前提是这两个类必须被同一个类加载器加载,否则这个两个类不“相等”。 这里指的“相等”,包括类的Class对象的equals()方法、isAssignableFrom()方法、isInstance()方法、instan原创 2016-02-29 22:04:34 · 4293 阅读 · 0 评论 -
[读书笔记]Java类加载过程
一. 类的生命周期类从被加载到虚拟机内存中开始,到卸载出内存为止,有以下(如图)的生命周期: 以上“加载->验证->准备->解析->初始化”称为类的加载过程。 Java虚拟机规范中没有对什么时候需要开始类加载的第一阶段进行强制约束,而是交给了虚拟机根据具体实现来自由把握。 但是对于初始化阶段,虚拟机有以下5种必须对类立即进行“初始化”的情况: (1)遇到new、getstatic、put原创 2016-02-28 23:50:18 · 4881 阅读 · 0 评论 -
[读书笔记]JVM的垃圾收集算法
1.标记-清除算法(1)算法思想:第一步,标记好所有需要回收的对象;第二步,清除被标记的对象。 (2)缺点:时间上,效率不高,无论是标记还是清除操作;空间上,会产生大量不连续的内存碎片,使得占用大内存的对象找不到足够的连续内存而进一步又提前触发一次GC。 标记-清除算法执行过程如下图所示: 2.复制算法(1)算法思想:内存区分成两部分大小相等的区域。一半作为使用区,一半作为保留区。申请内存时,原创 2016-02-28 00:16:29 · 6510 阅读 · 0 评论 -
A星算法(Java实现)
一、适用场景在一张地图中,绘制从起点移动到终点的最优路径,地图中会有障碍物,必须绕开障碍物。二、算法思路1. 回溯法得到路径(如果有路径)采用“结点与结点的父节点”的关系从最终结点回溯到起点,得到路径。2. 路径代价的估算:F = G+HA星算法的代价计算使用了被称作是启发式的代价函数。 先说明一下各符号意义:G表示的是 * 从起点到当前结点的实际路径代价 * (为啥叫实际?就是已经走过了,边走边原创 2016-02-25 12:54:27 · 18883 阅读 · 15 评论 -
[面经]CVTE的两道笔试编程题
晚上状态有点不好,然后就仓促参加笔试了。前面很多道选择题,真是坑,都是多选(混杂了多道单选)。下面就说说笔试题的两道编程题吧。其实我做的时候也是挺紧张的,随意符合题意的做完提交,也没加以优化,其实如果时间允许,我也是蛮想优化下的,不过这 场笔试不是看你优化得有多好,而是看你做对了没。第一道题:字符数组的循环右移问题 题目要求:将N个字符的数组,循环右移K位。时间复杂度O(N)。 现场思路原创 2016-03-05 22:49:15 · 10527 阅读 · 9 评论 -
[算法学习]8皇后问题
问题描述: 国际象棋的“8皇后问题”:在8x8的国际象棋上摆放8个皇后,使其不能互相攻击,即8个皇后中任意两个不得处在同一行、同一列或同一对角线上。共有多少种符合条件的摆法? 解法与分析: 1. 首先是不能同一列同一行,那么每个皇后必须各独占一行一列,使用二维数组来描述就有点浪费空间了。这里我们使用一个8个元素的一维数组来表示每个皇后的每一行。 2. 那么独占一列的情况,描述起来原创 2016-02-19 15:21:16 · 8934 阅读 · 1 评论 -
[算法学习]Java实现字符串全排列
思路:这里用到递归的方式完成字符数据的全排列,递归确实很方便。看似没用到辅助空间,实际上却是消耗了栈空间(“递归栈”),递归用起来也不是那么简单,解决问题用递归的时候,一定要关注到两个零界点,怎么开始和怎么结束。代码/** * 实现字符数组全排列 * * @author kesar * */public class TestPermute { public static v原创 2016-01-25 13:42:55 · 6436 阅读 · 5 评论 -
[算法学习]Java实现字符序列全组合
问题描述: 假设数组中字符无重复,输入一个字符数组,打印出字符的全部组合。例如:输入{a,b,c}输出a、b、c、ab、ac、bc、abc 解法与分析: 不使用辅助空间。输入一组n个字符的数组,将打印出C(1,n)+…+C(n,n)=2^n个组合。 1.按照从1到n作为一个循环,每次输出C(i,n)个组合。这样,我们只需要处理如何输出一个C(i,n)就可以解决问题。 2.处理C原创 2016-02-18 14:00:31 · 8771 阅读 · 0 评论 -
[算法学习]整数序列的奇偶分类
问题描述: 输入一组序列,奇数在前,偶数在后,输出整理后的序列。 解法与分析: 能马上想到用二分法,就很快能解决问题。参考代码如下/** * 解法:使用二分法 * @param nums */public static void reorderOddEven(int[] nums){ if(nums==null) { return; }原创 2016-02-18 13:59:51 · 8142 阅读 · 0 评论 -
[算法学习]顺时针打印矩阵
问题描述: 顺时针打印矩阵 例如: { {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 解法与分析: 考虑几个特殊情况:行1列n,行n列1,行1列1。考虑到这几个后其实就不难了。参考代码如下原创 2016-02-18 13:59:02 · 7136 阅读 · 0 评论 -
[算法学习]数组的旋转
问题描述: 返回将一维数组向右旋转k个位置的结果。 比如,一维数组{1,2,3,4,5},k=2时,返回结果是{4,5,1,2,3}。 要求常数级空间复杂度,允许修改原有数组。 解法与分析: 使用三旋转:全部旋转一次,前面0到k-1旋转一次,后面k到数组最后一个数旋转一次,就可以解决问题。参考代码如下public static int[] rotateK(int[] datas,原创 2016-02-18 13:58:13 · 7434 阅读 · 0 评论 -
[算法学习]二维数组的查找
问题描述: 二维数组中的查找。在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否包含该整数。 例如: { {1,2,3,4} {2,4,6,7} {4,5,7,8} {6,7,8,9} } 解法与分析: 可以使用二分法来查找。 1.原创 2016-02-18 13:57:28 · 8515 阅读 · 0 评论 -
[算法学习]两个栈实现一个队列
问题描述: 用两个栈实现一个队列,实现两个方法:入队appendTail,出队deleteHead 分析: 第一眼就能想到两个做法, (1) 入队麻烦出队容易: 声明两个栈,一个是存数据用的栈(dataStack),一个是辅助用的栈(tempStack)。 入队操作时,先将dataStack中的所有元素出栈压入tempStack中,然后将要入队的元素压入tem原创 2016-02-03 14:27:05 · 5300 阅读 · 0 评论 -
[算法学习]输入遍历重建二叉树
问题描述: 假设二叉树中的值都不重复, (1) 输入前序遍历和中序遍历的结果,输出该二叉树; (2) 输入中序遍历和后序遍历的结果,输出该二叉树。 分析: (1) 由前序确定根节点,中序确定左右子树范围,然后用递归重复这段逻辑。根据前序遍历可知根节点在第一个的位置,根据这个根节点在中序遍历中的位置,左边是左子树,右边是右子树,然后根据中序遍历的左右子树范围判断出前序原创 2016-02-03 14:25:31 · 5711 阅读 · 0 评论 -
[算法学习]斐波那契数计算
问题描述: Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 分析: 这里有两种解法,一种是用递归,一种使用循环。用递归的解法看起来很很简单,只需几行的代码就可以搞定,但是却隐藏着巨大的空间消耗和时间 消耗 。一种使用循环来做,写起来有点难看,至少没递归写起来好看,但是却比递归效率更高,几乎没有内存消耗。代码思路(1). 递归。代码如下(时原创 2016-02-03 14:24:07 · 6598 阅读 · 0 评论 -
[算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)
问题描述: 设计一个类,包含如下两个成员函数: Save(int input) 插入一个整数到一个整数集合里。 Test(int target) 检查是否存在两个数和为输入值。如果存在着两个数,则返回true,否则返回false 允许整数集合中存在相同值的元素 分析: 与[算法学习]给定一个整型数组,找出两个整数为指定整数的和(2)不同,这里需要算出的是存不存原创 2016-01-28 14:07:59 · 6015 阅读 · 0 评论 -
[算法学习]给定一个整型数组,找出两个整数为指定整数的和(1)
问题描述:给定一个整型数组,是否能找出其中的两个数使其和为某个指定的值?(假定是无序数组)解法一:暴力破解(穷举法,不提倡) /** * 暴力破解 * (穷举,时间复杂度:O(n^2),正常是不会用这个滴,假如只是为了快速解题,对时间没有限制,用这个最简单) * * @param nums * @param target */原创 2016-01-28 14:05:07 · 8417 阅读 · 0 评论 -
[java学习]移位运算交换两数的值的出错情况
移位运算,交换两数的值 int a=10; int b=52; System.err.println("开始:"+a+","+b); a=a^b; b=a^b; a=a^b; System.err.println("结束:"+a+","+b);结果是:开始:10,52结束:52,10什么时候会出错呢?当两个数都是自己时,将会计算出错,结果都会原创 2016-01-25 13:46:26 · 6497 阅读 · 0 评论 -
openfire的安装和配置
1. 下载下载最新的openfire安装文件 官方下载站点:http://www.igniterealtime.org/downloads/index.jsp#openfire 我下载的是zip版,我不太喜欢exe,比较喜欢压缩包,因为假如电脑重装了,那么exe的话,双击安装了。2. 配置(1) 解压zip后,点击进入 openfire>>bin 目录中 (2) 双击 openfire.exe原创 2015-12-05 00:46:58 · 10615 阅读 · 0 评论 -
开源混淆工具ProGuard配置详解及配置实例
ProGuard的作用:1.创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用; 2.创建的程序和程序库很难使用反向工程; 3.所以它能删除来自源文件中的没有调用的代码; 4.充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件;原创 2015-11-14 11:45:20 · 5833 阅读 · 0 评论 -
Java学习:获取当前类名、方法名
为了测试各个函数,如果手动打印每个类名、函数名,那么多函数的话能把人累死,Java早已准备好了一堆记录自身的函数。原创 2015-11-14 11:14:56 · 6438 阅读 · 0 评论 -
Java学习:协变数组和类型擦除(covariant array ; type erasure)
数组的协变性数组的协变性(covariant)是指:如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。而泛型是不可变的(invariant),List不会是List 的基类,更不会是它的子类。原创 2015-11-14 10:49:24 · 5857 阅读 · 0 评论