随笔
KesarChen
一个偏执于计算机的宅男。。。。
展开
-
[算法学习]判断链表是否是环结构
问题描述: 判断链表是否是环结构。 解法与分析: 用两个指针的方法判断。 1. 第一个指针在第一个结点,第二个指针在第二个结点处; 2. 两个指针同时移动,第一个指针每次移动一个结点,第二个指针每次移动两个结点; 3. 当第二个指针和第一个指针指向的结点是同一个时,链表有环。参考代码如下static class ListNode{ int val; L原创 2016-02-18 13:54:34 · 7512 阅读 · 0 评论 -
[算法学习]求出链表中倒数第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 · 8777 阅读 · 0 评论 -
[算法学习]求链表的中间结点
问题描述: 返回链表的中间结点(如果是两个则返回两个) 解法与分析: 用两个指针移动的方法来解决问题。一个指针每次移动1个结点,另外一个指针移动2个结点。参考代码如下static class ListNode{ int val; ListNode next; public ListNode(int val) { this.val = va原创 2016-02-18 13:56:00 · 7626 阅读 · 0 评论 -
[算法学习]复杂链表的复制
问题描述: 复制一个复杂链表。 在复杂链表中,每个结点除了有一个指向下一个结点的next指针外,还有一个 sibing指针 指向链表中任意结点或者NULL。解法一:“爆破” 解法分析: 1. 遍历第一遍数组,把复制链的next和各结点值复制好。需要时间O(n) 2. 第二遍遍历,二重for循环根据原链表,将复制链的slibing指针连接好。需要时间O(n^2) 3. 需要时原创 2016-02-18 13:56:50 · 7110 阅读 · 0 评论 -
[算法学习]二维数组的查找
问题描述: 二维数组中的查找。在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否包含该整数。 例如: { {1,2,3,4} {2,4,6,7} {4,5,7,8} {6,7,8,9} } 解法与分析: 可以使用二分法来查找。 1.原创 2016-02-18 13:57:28 · 8534 阅读 · 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 · 7451 阅读 · 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 · 7149 阅读 · 0 评论 -
[算法学习]整数序列的奇偶分类
问题描述: 输入一组序列,奇数在前,偶数在后,输出整理后的序列。 解法与分析: 能马上想到用二分法,就很快能解决问题。参考代码如下/** * 解法:使用二分法 * @param nums */public static void reorderOddEven(int[] nums){ if(nums==null) { return; }原创 2016-02-18 13:59:51 · 8153 阅读 · 0 评论 -
[算法学习]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 · 8780 阅读 · 0 评论 -
[算法学习]合并两个排序的链表
问题描述: 合并两个排序的链表。解法一:用递归 解法: 递归比较结点大小:每次递归,取出两个链表的头结点来比较,比较小的结点加入新链表中。参考代码如下/** * 用递归 * @param head1 * @param head2 * @return */public static ListNode merge(ListNode head1, ListNode head2){原创 2016-02-18 13:53:35 · 7404 阅读 · 1 评论 -
[算法学习]反转链表
问题描述: 输入一条链表,将链表反转后返回。解法一:用递归 解法: 由于反转后头结点会成为尾结点,尾结点会成会头结点。所以从头结点开始反转前后结点关系。比较简单,所以这里直接贴出代码。参考代码如下/** * 递归 * @param head * @return */public static ListNode reverseList1(ListNode head){ if原创 2016-02-18 13:52:54 · 7395 阅读 · 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 · 7924 阅读 · 0 评论 -
ubuntu下使用hexo搭建博客
1.安装Node.jssudo add-apt-repository ppa:chris-lea/node.jssudo apt-get updatesudo apt-get install nodejs2.安装Gitsudo apt-get install git3.安装hexo sudo npm install hexo -g初始你博客的根目录(或者cd到指定目录下,然后执行hexo ini原创 2016-01-25 13:45:36 · 15110 阅读 · 0 评论 -
[算法学习]后缀表达式转二叉树
问题描述: 输入后缀表达式,输出后缀表达式的二叉树。 解法与分析: 1. 根据后缀表达式的特点,我们可以知道,只要是运算符的就都是根结点。 2. 我们这里需要使用一个栈来保存字符。遍历后缀表达式,每当遇到是非运算符的字符,就将它入栈,当遇到是运算符,就将栈中前两个结点出栈,和运算符组成一棵子树,然后入栈。遍历完成后,栈中剩下的唯一的一个结点就是该后缀表达式的二叉树的根结点。原创 2016-02-18 13:33:33 · 13341 阅读 · 1 评论 -
[算法学习]树的广度遍历
问题描述: 从上层向下层遍历,从左向右打印出一棵树 。 解法与分析: 广度遍历,按照从左向右的方式,我们可以使用队列来保存每一层的结点,每次结点出队,将出队结点的子结点入队,直至队列为空,就可以打印出符合要求的树遍历。参考代码如下/** * 从上层向下层遍历,从左向右 * @param root */public static void printTreeFromTopTOB原创 2016-02-18 13:35:16 · 6447 阅读 · 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 · 6463 阅读 · 0 评论 -
[算法学习]树的子结构
问题描述: 判断树A是否是树B的子结构。 解法与分析: 使用递归的方式很容易解决。先进行根结点比较,相等的话,递归左右子树。参考代码如下public static boolean isIncludeTree(TreeNode parent, TreeNode child){ boolean result = false; if (parent == null || c原创 2016-02-18 13:47:26 · 6996 阅读 · 0 评论 -
[算法学习]打印树的路径
问题描述: 输入一个整数sum和一棵二叉树,打印出二叉树中结点和为sum的所有路径。 (路径:从根结点往下一直到叶结点形成的一条路径。) 解法与分析: 1. 需要从树上的根结点遍历到叶子结点,其中需要累加经过结点的值。 2. 当累加到叶子结点时,比较累加结点值和sum的值,如果相等,打印出路径;如果不相等,返回到上一层,寻找其他叶子结点。 3. 需要保存结点路径,还可以原创 2016-02-18 13:48:59 · 8667 阅读 · 0 评论 -
[算法学习]二叉搜索树转双向链表
问题描述: 将一棵二叉搜索树转成一条排序好的双向链表。要求不能创建新结点。 解法与分析: 1. 由于左子树<根结点<右子树,所以双向链表的头结点是二叉搜索树左子树中的最后一个左结点,双向链表的头结点是二叉搜索树右子树中的最后一个右结点,根结点则是链表的中间结点。 2. 将树结点中指向左孩子的指针作为双向链表中的前驱指针,指向右孩子的指针作为双向链表指向后继结点的指针。原创 2016-02-18 13:49:50 · 7334 阅读 · 0 评论 -
[算法学习]栈的出栈序列
问题描述: 输入数字不重复的两组整数序列:压栈的序列A,出栈的序列B,验证AB是否为同一栈的序列。 解法与分析: 1. 使用两个指针pA,pB分别在两个序列A,B上遍历。 2. 做个这样的判断,首先判断两个指针所指元素是否相等,若相等,则两个指针同时推进;若不相等,取出栈顶元素作比较;若与栈顶元素不相等,则序列A的元素入栈,pA指针向前推进,若与栈顶元素相等,则出栈,pB指针原创 2016-02-18 13:50:39 · 9730 阅读 · 0 评论 -
[算法学习]栈中的最小值
问题描述: 实现栈的pop、push、 min (得到栈中最小值)方法。 解法与分析: 1. 由于每次压栈和出栈都可能会改变栈中的最小值,所以,我们增加一个存放最小值的栈。 2. 当出栈操作时,最小值的栈也出栈;(当然,必须判断栈是否为空) 3. 当压栈操作时,比较压栈元素值和最小栈的栈顶元素的大小,若比较小,则将它压入栈中,若不是,则将最小栈的栈顶元素重复压栈。(当然原创 2016-02-18 13:51:19 · 8420 阅读 · 0 评论 -
[算法学习]8皇后问题
问题描述: 国际象棋的“8皇后问题”:在8x8的国际象棋上摆放8个皇后,使其不能互相攻击,即8个皇后中任意两个不得处在同一行、同一列或同一对角线上。共有多少种符合条件的摆法? 解法与分析: 1. 首先是不能同一列同一行,那么每个皇后必须各独占一行一列,使用二维数组来描述就有点浪费空间了。这里我们使用一个8个元素的一维数组来表示每个皇后的每一行。 2. 那么独占一列的情况,描述起来原创 2016-02-19 15:21:16 · 8955 阅读 · 1 评论