<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[William]]></title><description><![CDATA[给自己一个平台，扎实总结，不断学习。]]></description><link>https://blog.youkuaiyun.com/qq_21918021</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_21918021]]></copyright><item><title><![CDATA[[剑指offer] 斐波那契数列]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89487468</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89487468</guid><author>qq_21918021</author><pubDate>Wed, 24 Apr 2019 10:24:01 +0800</pubDate><description><![CDATA[题目描述
大家都知道斐波那契数列，现在要求输入一个整数n，请你输出斐波那契数列的第n项（从0开始，第0项为0）。
n&lt;=39
解题思路
公式:
f(n) = n, n &lt;= 1
f(n) = f(n-1) + f(n-2), n &gt; 1
可以直接使用递归的方法：
if(n&lt;=1) return n;
else return Fibonacci(n-1)+Fibonacci(...]]></description><category></category></item><item><title><![CDATA[二、Git之仓库与多人协助]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89476775</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89476775</guid><author>qq_21918021</author><pubDate>Tue, 23 Apr 2019 17:12:32 +0800</pubDate><description><![CDATA[一、远程仓库
在了解之前，先注册github账号，由于你的本地Git仓库和github仓库之间的传输是通过SSH加密的，所以需要一点设置：

第一步：创建SSHKey。在用户主目录下，看看有没有.ssh目录，如果有，再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件，如果有的话，直接跳过此如下命令，如果没有的话，打开命令行，输入如下命令：
ssh-keygen -t rsa –C ...]]></description><category></category></item><item><title><![CDATA[一、Git之基本操作]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89472277</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89472277</guid><author>qq_21918021</author><pubDate>Tue, 23 Apr 2019 14:39:34 +0800</pubDate><description><![CDATA[一、Git是什么？
Git是目前世界上最先进的分布式版本控制系统。
二、SVN与Git的最主要的区别？

SVN是集中式版本控制系统，版本库是集中放在中央服务器的，而干活的时候，用的都是自己的电脑，所以首先要从中央服务器哪里得到最新的版本，然后干活，干完后，需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作，如果在局域网还可以，带宽够大，速度够快，如果在互联网下，如果网速慢的...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 复杂链表的复制]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89453704</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89453704</guid><author>qq_21918021</author><pubDate>Tue, 23 Apr 2019 09:18:00 +0800</pubDate><description><![CDATA[题目描述
输入一个复杂链表（每个节点中有节点值，以及两个指针，一个指向下一个节点，另一个特殊指针指向任意一个节点），返回结果为复制后复杂链表的head。（注意，输出结果中请不要返回参数中的节点引用，否则判题程序会直接返回空）
解题思路

参考代码
/*
public class RandomListNode {
    int label;
    RandomListNode next = nu...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 两个链表的第一个公共结点]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89453829</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89453829</guid><author>qq_21918021</author><pubDate>Tue, 23 Apr 2019 09:17:46 +0800</pubDate><description><![CDATA[题目描述
输入两个链表，找出它们的第一个公共结点。
解题思路
如果两个链表存在公共结点，那么它们从公共结点开始一直到链表的结尾都是一样的，因此我们只需要从链表的结尾开始，往前搜索，找到最后一个相同的结点即可。但是题目给出的单向链表，我们只能从前向后搜索，这时，我们就可以借助栈来完成。先把两个链表依次装到两个栈中，然后比较两个栈的栈顶结点是否相同，如果相同则出栈，如果不同，那最后相同的结点就是我们要...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 合并两个排序的链表]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89453673</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89453673</guid><author>qq_21918021</author><pubDate>Mon, 22 Apr 2019 15:58:01 +0800</pubDate><description><![CDATA[题目描述
输入两个单调递增的链表，输出两个链表合成后的链表，当然我们需要合成后的链表满足单调不减规则。
解题思路
两种解法：递归和非递归
参考代码
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
/...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 链表中倒数第k个结点]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89453646</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89453646</guid><author>qq_21918021</author><pubDate>Mon, 22 Apr 2019 15:57:10 +0800</pubDate><description><![CDATA[题目描述
输入一个链表，输出该链表中倒数第k个结点。
解题思路
经典的双指针法。定义两个指针，第一个指针从链表的头指针开始遍历向前走k-1步，第二个指针保持不动，从第k步开始，第二个指针也开始从链表的头指针开始遍历，由于两个指针的距离保持在k-1，当第一个指针到达链表的尾节点时，第二个指针刚好指向倒数第k个节点。
关注要点

链表头指针是否为空，若为空则直接返回回null
k是否为0，k为0也就是...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 反转链表]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89453608</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89453608</guid><author>qq_21918021</author><pubDate>Mon, 22 Apr 2019 15:55:58 +0800</pubDate><description><![CDATA[题目描述
输入一个链表，反转链表后，输出新链表的表头。
解题思路
设置三个指针，head为当前节点，pre为当前节点的前一个节点，next为当前节点的下一个节点，需要pre和next的目的是让当前节点从pre-&gt;head-&gt;next1-&gt;next2变成pre&lt;-head next1-&gt;next2的过程中，用pre让节点反转所指方向，next节点保存next1节点防止链...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 从尾到头打印链表]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89453572</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89453572</guid><author>qq_21918021</author><pubDate>Mon, 22 Apr 2019 15:54:58 +0800</pubDate><description><![CDATA[题目描述
输入一个链表，按链表值从尾到头的顺序返回一个ArrayList。
解题思路

一种方法是利用栈来实现；
另外一种方法是利用三个指针把链表反转，关键是 r 指针保存断开的节点。
参考代码
/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 滑动窗口的最大值]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89453449</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89453449</guid><author>qq_21918021</author><pubDate>Mon, 22 Apr 2019 15:51:47 +0800</pubDate><description><![CDATA[题目描述
给定一个数组和滑动窗口的大小，找出所有滑动窗口里数值的最大值。例如，如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3，那么一共存在6个滑动窗口，他们的最大值分别为{4,4,6,6,6,5}； 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个： {[2,3,4],2,6,2,5,1}， {2,[3,4,2],6,2,5,1}， {2,3,[4,2,6],2,5...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 构建乘积数组]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89451475</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89451475</guid><author>qq_21918021</author><pubDate>Mon, 22 Apr 2019 14:41:03 +0800</pubDate><description><![CDATA[题目描述
给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。
解题思路

B[i]的值可以看作图中矩阵第 i 行所有元素的乘积。我们可以先算下三角中的连乘，即我们先算出B[i]中的一部分，然后倒过来按上三角中的分布规律，把另一部分也乘进去。
参考代码
public cla...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 数组中重复的数字]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89451339</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89451339</guid><author>qq_21918021</author><pubDate>Mon, 22 Apr 2019 14:35:21 +0800</pubDate><description><![CDATA[题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的，但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如，如果输入长度为7的数组{2,3,1,0,2,5,3}，那么对应的输出是第一个重复的数字2。
解题思路
最简单的就是用一个数组或者哈希表来存储已经遍历过的数字，但是这样需要开辟额外的空间。
如果题目要求不能开辟额外的...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 孩子们的游戏(圆圈中最后剩下的数)]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89451050</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89451050</guid><author>qq_21918021</author><pubDate>Mon, 22 Apr 2019 14:22:53 +0800</pubDate><description><![CDATA[题目描述
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下去….直到剩下最...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 扑克牌顺子]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89450859</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89450859</guid><author>qq_21918021</author><pubDate>Mon, 22 Apr 2019 14:15:30 +0800</pubDate><description><![CDATA[题目描述
LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿！！“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子……LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 数组中只出现一次的数字]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89447916</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89447916</guid><author>qq_21918021</author><pubDate>Mon, 22 Apr 2019 11:06:06 +0800</pubDate><description><![CDATA[题目描述
一个整型数组里除了两个数字之外，其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
解题思路
法一：大家都能想到的HashMap法
法二：异或法
任何一个数字异或它自己都等于0。
如果数组中只一个数字是只出现一次的，其他数字都是成双成对出现的，那么我们从头到尾依次异或数组中的每个数字，最终的结果刚好就是那个只出现一次的数字，因为那些成对出现两次的数字全部在异或中抵消了。
那么...]]></description><category></category></item><item><title><![CDATA[二分查找：非递归实现和递归实现]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89405528</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89405528</guid><author>qq_21918021</author><pubDate>Fri, 19 Apr 2019 18:00:44 +0800</pubDate><description><![CDATA[二分查找简介
二分查找的条件是对一组有序数组的查找，这一点很容易忘记，在使用二分查找的时候先要对数组进行排序。
先说一下二分查找的思路：一个有序数组，想要查找一个数字key的下标，首先算出中间下标mid，利用mid把这个数组分为两半，前一半从下标0到mid-1，后一半从mid+1到数组最后一个元素（下标是数组长度减一）。把这个查找的元素key和数组下标为mid的元素进行比较，也就是和中间那个元素进...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 数字在排序数组中出现的次数]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89405420</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89405420</guid><author>qq_21918021</author><pubDate>Fri, 19 Apr 2019 17:56:13 +0800</pubDate><description><![CDATA[题目描述
统计一个数字在排序数组中出现的次数。
解题思路
正常的思路就是二分查找了，我们用递归的方法实现了查找k第一次出现的下标，用循环的方法实现了查找k最后一次出现的下标。
除此之外，还有另一种奇妙的思路，因为data中都是整数，所以我们不用搜索k的两个位置，而是直接搜索k-0.5和k+0.5这两个数应该插入的位置，然后相减即可。
参考代码
法一：
//普通循环查找
public class S...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 把数组排成最小的数]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89405010</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89405010</guid><author>qq_21918021</author><pubDate>Fri, 19 Apr 2019 17:35:29 +0800</pubDate><description><![CDATA[题目描述
输入一个正整数数组，把数组里所有数字拼接起来排成一个数，打印能拼接出的所有数字中最小的一个。例如输入数组{3，32，321}，则打印出这三个数字能排成的最小数字为321323。
参考代码
public class Solution {
    public static String PrintMinNumber(int [] numbers) {
        int n;
    ...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 连续子数组的最大和]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89402485</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89402485</guid><author>qq_21918021</author><pubDate>Fri, 19 Apr 2019 16:10:39 +0800</pubDate><description><![CDATA[题目描述
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢？例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住？(子向量的长度...]]></description><category></category></item><item><title><![CDATA[[剑指offer] 最小的K个数]]></title><link>https://blog.youkuaiyun.com/qq_21918021/article/details/89401583</link><guid>https://blog.youkuaiyun.com/qq_21918021/article/details/89401583</guid><author>qq_21918021</author><pubDate>Fri, 19 Apr 2019 15:40:38 +0800</pubDate><description><![CDATA[题目描述
输入n个整数，找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字，则最小的4个数字是1,2,3,4。
解题思路
两种方法：
法1：先对数组排序，然后取出前k个。
法2：利用最大堆保存这k个数，每次只和堆顶比，如果比堆顶小，删除堆顶，新数入堆。
参考代码
法1：
（这里我们顺便复习下手动排序，我们选择插入排序）
public class Solution {
    p...]]></description><category></category></item></channel></rss>