<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[酱油的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/u012289407</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; u012289407]]></copyright><item><title><![CDATA[剑指Offer--面试题29:数组中出现超过一半的数字]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46674219</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46674219</guid><author>u012289407</author><pubDate>Sun, 28 Jun 2015 21:20:16 +0800</pubDate><description><![CDATA[题目描述：数组中有一个数字出现的次数超过数组长度的一半，请找出这个数字。例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次，超过数组长度的一半，因此输出2。解题思路：思路有多个，比如先排序，找到中位数，则有可能是所要找的数字。或者利用快排的思想，找到下标[n/2]的数字即中位数。中位数有可能是要找的数字，但只是有可能是，因为出现次数超过一半]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题28:字符串的排列--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46672481</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46672481</guid><author>u012289407</author><pubDate>Sun, 28 Jun 2015 16:55:29 +0800</pubDate><description><![CDATA[题目描述：输入一个字符串，打印出该字符串中字符的所有排列。例如输入字符串abc，则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。解题思路：我们求整个字符串的排列，可以看成两步，首先求可能出现在第一个位置上的字符，即把第一个字符和后面所有的字符交换。第二步固定一个字符，求后面所有字符的全排列。这是一个递归的思想。代码：public class Permu]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题28:字符串的排列--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46672435</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46672435</guid><author>u012289407</author><pubDate>Sun, 28 Jun 2015 16:51:06 +0800</pubDate><description><![CDATA[题目描述：输入一个字符串，打印出该字符串中字符的所有排列。例如输入字符串abc，则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。解题思路：我们求整个字符串的排列，可以看成两步，首先求可能出现在第一个位置上的字符，即把第一个字符和后面所有的字符交换。第二步固定一个字符，求后面所有字符的全排列。这是一个递归的思想。代码：public class Permu]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题27:二叉搜索树与双向链表--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46663145</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46663145</guid><author>u012289407</author><pubDate>Sat, 27 Jun 2015 18:23:01 +0800</pubDate><description><![CDATA[题目描述：输入一颗二叉搜索树，将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点，只能调整树中结点指针的指向。思路：原先指向左子结点的指针调整为链表中指向前一个结点的指针，原先指向右子结点的指针指向为链表中指向后一个结点的指针。由于要求转换后是排好序的链表，所以应该采用中序遍历的方法。 
当遍历到根节点的时候，我们把树看成三部分 
值为10的根结点，根结点值为6的左子树，根结点值为14的]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题26:复杂链表的复制--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46609731</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46609731</guid><author>u012289407</author><pubDate>Tue, 23 Jun 2015 20:14:27 +0800</pubDate><description><![CDATA[题目描述：复制一个复杂链表，在复杂链表中，每个结点除了有一个next指针指向下一个结点外，还有一个sbiling指向链表中的任意结点或者null。下图是一个复杂链表的示例，Null的指针没有画出。 
解题思路：1.很直观的解法就是分成两步：1).复制原始链表上的每一个结点，并用next指针连起来。 
2).复制sbiling指针。 
但是复制sbiling指针时需要比较高的复杂度。 
以上图为例，如]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题25:二叉树中和为某一值的路径--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46582893</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46582893</guid><author>u012289407</author><pubDate>Sun, 21 Jun 2015 17:14:23 +0800</pubDate><description><![CDATA[题目描述： 
输入一课二叉树和一个整数，打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解题思路： 
先模拟一下过程：树的结构如下所示，期待路径的和为22 
10→5→4是一条路径，它们的和不是22。所以下一条路径10→5→7，（这是一种回溯的方法），它们的和22，然后回溯，下一条路径10→12。这里我们只有到叶子结点才有必要判断和是否等于期待]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题24:二叉搜索树的后序遍历序列--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46582585</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46582585</guid><author>u012289407</author><pubDate>Sun, 21 Jun 2015 16:28:15 +0800</pubDate><description><![CDATA[题目描述： 
输入一个整数数组，判断该数组是不是某二叉搜索树的后序遍历的结果。如果是返回true，否则返回false。假设输入的数组的任意两个数字互不相同。解题思路： 
要明确两个概念： 
1. 二叉搜索树的特点，就是如果有对任何一个非空结点，假如左子树存在，那么左子树的中任意一个结点都比该根结点小，假如右子树存在，那么右子树中的任何一个节点都比该根结点大。2.二叉树的后序遍历，也就是 左→右→根]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题23:从上往下打印二叉树--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46581529</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46581529</guid><author>u012289407</author><pubDate>Sun, 21 Jun 2015 13:04:00 +0800</pubDate><description><![CDATA[题目描述： 
从上往下打印出二叉树的每个结点，同一层的结点按照从左到右的顺序打印。解题思路： 
这其实是树的广度优先遍历。利用一个队列可以实现。
import java.util.LinkedList;
import java.util.Queue;public class PrintFromTopToBottomTest {    static class Node{
        int ke]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题22:栈的压入、弹出序列--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46565039</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46565039</guid><author>u012289407</author><pubDate>Fri, 19 Jun 2015 21:12:18 +0800</pubDate><description><![CDATA[题目描述：输入两个整数序列，第一个序列表示栈的压入顺序，请判断第二个序列是否为该栈的弹出序列。假如压入栈的所有数字均不相同。例如序列1、2、3、4、5是某栈的压栈序列，序列4、5、3、2、1是该栈序列对应的一个弹出序列，但4、3、5、1、2就不可能是该压栈序列的弹出序列。解题思路： 
这种题以前在考试或考研中很常见的选择题，进出栈模拟过程就不解释了。只说一下编程思路： 
如果下一个弹出的数字刚好是栈]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题21:包含min函数的栈--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46564841</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46564841</guid><author>u012289407</author><pubDate>Fri, 19 Jun 2015 20:24:03 +0800</pubDate><description><![CDATA[题目描述： 
定义栈的数据结构，请在该类型中实现一个能够得到栈的最小元素的min函数。思路： 
如果只用一个元素保存最小的元素，那么当最小的元素被弹出后，就没有办法得到剩余元素中最下的元素。 
所以，最好的办法是将每次的最小元素（之前的最小元素和新压入的元素两者的较小者）都保存起来放到另外一个辅助栈里。这是剑指offer书中的举例一个模拟过程： 
代码：import java.util.Stack;]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题20:顺时针打印矩阵--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46564677</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46564677</guid><author>u012289407</author><pubDate>Fri, 19 Jun 2015 19:44:00 +0800</pubDate><description><![CDATA[题目描述： 
输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。例如：如果输入如下矩阵：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解题思路：我们可以把矩阵想象成若干个圈，我们可以用一个循环来打印矩阵，每]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题19：二叉树的镜像--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46524245</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46524245</guid><author>u012289407</author><pubDate>Tue, 16 Jun 2015 22:09:13 +0800</pubDate><description><![CDATA[题目描述： 
请完成一个函数，输入一个二叉树，该函数输出它的镜像。解题思路： 
我们先前序遍历这棵树的每个结点，如果这个结点有子结点，就交换它的两个子结点。当交换完所有非叶子结点的左右子结点后，就得到了树的镜像。这里采用了递归方式和非递归方式。
import java.util.Stack;
public class MirrorRecursivelyTest {    static class N]]></description><category></category></item><item><title><![CDATA[剑指Offer--面试题18:数的子结构--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46523015</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46523015</guid><author>u012289407</author><pubDate>Tue, 16 Jun 2015 20:26:50 +0800</pubDate><description><![CDATA[题目描述： 
输入两颗二叉树A和B，判断B是不是A的子结构。解题思路： 
要查找树A中是否存在和树B结构一样的子树，我们可以分为两步：第一步在树A中找到和树B的根结点的值一样的结点R，第二步再判断树A中以R为根结点的子树是不是包含和B一样的结构。通常我们都会采用递归的方式，但是这里需要注意的检查边界条件，即空指针。代码如下：public class HasSubTreeTest {    stati]]></description><category></category></item><item><title><![CDATA[剑指Offer--面试题17：合并两个排序的链表--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46508605</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46508605</guid><author>u012289407</author><pubDate>Mon, 15 Jun 2015 21:53:22 +0800</pubDate><description><![CDATA[题目描述： 
输入两个排序的链表，合并这两个链表并使新链表的结点仍然是按递增排序的。解题思路： 
思路很简单，就是比较两个头结点的大小，取较小的结点加入到新链表中去，一个简单的递归。 
要注意的是鲁棒性，检查输入。代码：public class MergeListTest {    static class Node {
        int key;
        Node next;]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题16：翻转链表--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46508481</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46508481</guid><author>u012289407</author><pubDate>Mon, 15 Jun 2015 21:36:37 +0800</pubDate><description><![CDATA[题目描述： 
定义一个函数，输入一个链表的头结点，反转该链表并输出反转后链表的头结点。解题思路： 
为了反转列表，其实就是为了改变next指针，由指向后一个变为指向前一个。 
这里为了避免链表断裂，要保存三个结点，即当前结点，前一个结点和后一个结点。代码：
public class ReverseListTest {    static class ListNode {
        int ke]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题15：链表中倒数第K个结点--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46352233</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46352233</guid><author>u012289407</author><pubDate>Wed, 03 Jun 2015 22:10:33 +0800</pubDate><description><![CDATA[题目描述： 
输入一个链表，输出链表中倒数第K个结点。为了符合大多数人的习惯，本题从1开始计数，即链表的尾结点是倒数第1个结点。例如一个链表有6个结点，从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。解题思路：请注意这是指的单向列表，不能从尾结点向前回溯。1.倒数第k个结点，就是整数第n-k+1个结点，所以如果我们能够获得链表的长度，就能够采用这种办法，想要]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题14：调整数组顺序使奇数位于偶数前面--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/46351305</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/46351305</guid><author>u012289407</author><pubDate>Wed, 03 Jun 2015 20:57:29 +0800</pubDate><description><![CDATA[题目描述： 
输入一个整数数组，实现一个函数来调整该数组中数字的顺序，使得所有奇数位于数组的前半部分，所有偶数位于数组的后半部分。解题思路： 
这个题目的思路还是很简单的，就是利用交换的思想。 
两个指针，一个从前往后一个从后往前，在相遇之前，如果前面的指针遇到偶数就和后面指针遇到的奇数交换，其实就是快排的内部的一个过程。这个题的重点在于可扩展性，也就是说不局限于偶数和奇数 或者大小或者把能被3整除]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题13：在O(1)时间删除链表结点--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/45828449</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/45828449</guid><author>u012289407</author><pubDate>Mon, 18 May 2015 21:57:42 +0800</pubDate><description><![CDATA[题目描述： 
在给定的单向列表的头指针和一个结点指针，定义在一个函数在O(1)时间删除该结点。解题思路： 
一般单向列表删除结点，就是从头遍历，找到这个结点之前的结点，指向这个结点之后的结点，就算是删除了这个结点。 
这种方法的时间复杂度为O(n) 
题目要求在O(1)时间内完成，所以应该避免遍历。 
我们遍历的目的是为了找到这个结点前面的那个结点，所以我们可以采用下面的办法。 
将待删除结点的下一]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题12：打印1到最大的n位数--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/45699971</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/45699971</guid><author>u012289407</author><pubDate>Wed, 13 May 2015 21:36:20 +0800</pubDate><description><![CDATA[题目描述： 
输入数字n，按顺序打印出从1到最大的n位十进制数，比如输入3，则打印出1、2、3直到最大的3位数即999。思路： 
首先应该意识到这是一个大数问题 
Java中有两个提供高精度计算的类，即BigInteger和BigDemical。BigInteger支持任意精度的整数，而BigDemical支持任意精度的定点数。如果利用这个类，可以容易的写出以下代码：public static vo]]></description><category></category></item><item><title><![CDATA[剑指offer--面试题11：数值的整数次方--Java实现]]></title><link>https://blog.youkuaiyun.com/u012289407/article/details/45649135</link><guid>https://blog.youkuaiyun.com/u012289407/article/details/45649135</guid><author>u012289407</author><pubDate>Mon, 11 May 2015 21:22:23 +0800</pubDate><description><![CDATA[题目描述： 
实现函数double Power(double base, int exponent)，求base的exponent次方。不得使用库函数，同时不要考虑大数问题。思路： 
实现功能还是比较简单的，一个循环就可以完成。 
这个题目考查的重点在于边界测试和负面测试。在这种数值的题目中一定要留意三种情况，即正数，负数，0。注意以下几种情况： 
1.底数为0，如果指数为负数，这是不合法的。 
2]]></description><category></category></item></channel></rss>