<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Gnikay的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Gnikay</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Gnikay]]></copyright><item><title><![CDATA[python 3.8 安装蓝牙pybluez 以及anconda虚拟环境问题解决]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/127360870</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/127360870</guid><author>Gnikay</author><pubDate>Mon, 17 Oct 2022 12:14:09 +0800</pubDate><description><![CDATA[python 3.8 安装蓝牙pybluez 以及anconda虚拟环境问题解决]]></description><category></category></item><item><title><![CDATA[java - 寻找一个值的二分查找、寻找左/侧边界的二分查找总结]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/126902827</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/126902827</guid><author>Gnikay</author><pubDate>Sat, 17 Sep 2022 11:50:55 +0800</pubDate><description><![CDATA[上述解释只有找个例子跑一遍才能理解，如果不想理解直接记住框架即可。在二分查找指定值的基础上，无论是寻找最左侧的指定值还是寻找最右侧的指定值，只需要记住下面几个原则：1 寻找左侧就把右侧收紧，即right= mid - 1，同样寻找右侧就要把左侧收紧，即left= mid + 1寻找左侧target时，target太大，导致左侧不断收紧，右侧不变，直到left == nums.length寻找右侧target时，target太小，导致右侧不断收紧，左侧不变，直到right == -1。]]></description><category></category></item><item><title><![CDATA[正则表达式总结—用python举例]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/125757132</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/125757132</guid><author>Gnikay</author><pubDate>Wed, 13 Jul 2022 09:40:28 +0800</pubDate><description><![CDATA[无]]></description><category></category></item><item><title><![CDATA[java - 23. 合并K个升序链表 - 优先级队列PriorityQueue]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124667171</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124667171</guid><author>Gnikay</author><pubDate>Mon, 09 May 2022 15:45:21 +0800</pubDate><description><![CDATA[一 思路



1 和合并2个升序链表类似，先对比链表头的k个数，这里用优先级队列(二叉树堆)来保存
2 每次拿出二叉树堆中的最小值，然后把当前链表的下一个入堆，直到排序完成


二 代码


class Solution {
    // 第一种写法：lambda表达式
public ListNode mergeKLists(ListNode[] lists) {
        if (lists.length == 0) return null;
        PriorityQueue&lt;Li]]></description><category></category></item><item><title><![CDATA[java - 142. 环形链表 II - 通俗易懂题解]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124619320</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124619320</guid><author>Gnikay</author><pubDate>Fri, 06 May 2022 21:30:20 +0800</pubDate><description><![CDATA[1 思路



 1、 首先设置快慢指针，慢指针走一步，快指针走两步
 2、 两者如果相遇说明有环，假设慢指针走了k步，则快指针走了2k步。
    慢指针从头走到相遇点为k，那么从相遇点再走k步就会再次走到相遇点，也就是慢指针的2k步。
    假设环起点距离相遇点为m步，那么慢指针从头走到环起点为k-m步，因为走到环起点再走m就走到了相遇点。
    如果慢指针走到相遇点，再走k步将会第二次到达相遇点（因为共2k步，和快指针路径一致）。所以，如果走的不是k，而是k-m也会到达环起点。
 3、 2中分析了]]></description><category></category></item><item><title><![CDATA[链表虚拟头节点的好处]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124616723</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124616723</guid><author>Gnikay</author><pubDate>Fri, 06 May 2022 19:12:40 +0800</pubDate><description><![CDATA[1 使用了虚拟头结点的技巧，也是为了防止出现空指针的情况。

比如说链表总共有 5 个节点，题目就让你删除倒数第 5 个节点，也就是第一个节点，那按照算法逻辑，应该首先找到倒数第 6 个节点。但第一个节点前面已经没有节点了，这就会出错。

但有了我们虚拟节点dummy的存在，就避免了这个问题，能够对这种情况进行正确的删除。
...]]></description><category></category></item><item><title><![CDATA[java四舍五入保留n位小数]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124258585</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124258585</guid><author>Gnikay</author><pubDate>Mon, 18 Apr 2022 20:29:39 +0800</pubDate><description><![CDATA[double payPercent=123.123456785;
BigDecimal bg = new BigDecimal(String.valueOf(payPercent)).setScale(8, RoundingMode.HALF_UP);
System.out.println(bg.doubleValue());  // 123.12345679;


]]></description><category></category></item><item><title><![CDATA[java - 11. 盛最多水的容器 - 双指针O(n)]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124213470</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124213470</guid><author>Gnikay</author><pubDate>Sat, 16 Apr 2022 14:39:18 +0800</pubDate><description><![CDATA[一、题目

给定一个长度为 n 的整数数组 height 。有 n 条垂线，第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线，使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明：你不能倾斜容器。




输入：[1,8,6,2,5,4,8,3,7]
输出：49
解释：图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下，容器能够容纳水（表示为蓝色部分）的最大值为49。


二、思路


1 双指..]]></description><category></category></item><item><title><![CDATA[java - 811. 子域名访问计数 - HashMap]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124189527</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124189527</guid><author>Gnikay</author><pubDate>Fri, 15 Apr 2022 10:41:12 +0800</pubDate><description><![CDATA[一、题目

网站域名 "discuss.leetcode.com" 由多个子域名组成。顶级域名为 "com" ，二级域名为 "leetcode.com" ，最低一级为 "discuss.leetcode.com" 。当访问域名 "discuss.leetcode.com" 时，同时也会隐式访问其父域名 "leetcode.com" 以及 "com" 。

计数配对域名 是遵循 "rep d1.d2.d3" 或 "rep d1.d2" 格式的一个域名表示，其中 rep 表示访问域名的次数，d1.d2.d3 为]]></description><category></category></item><item><title><![CDATA[java - 771. 宝石与石头 - HashMap]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124182101</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124182101</guid><author>Gnikay</author><pubDate>Thu, 14 Apr 2022 21:22:16 +0800</pubDate><description><![CDATA[一、题目

给你一个字符串 jewels 代表石头中宝石的类型，另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型，你想知道你拥有的石头中有多少是宝石。

字母区分大小写，因此 "a" 和 "A" 是不同类型的石头。



输入：jewels = "aA", stones = "aAAbbbb"
输出：3


二、思路

1 遍历 jewels 数组，把每个字母作为key放入hash表
	2 遍历stones 数组，如果在hash表存在，result++
]]></description><category></category></item><item><title><![CDATA[java - 219. 存在重复元素 II - HashMap]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124181462</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124181462</guid><author>Gnikay</author><pubDate>Thu, 14 Apr 2022 20:55:20 +0800</pubDate><description><![CDATA[一、题目

给你一个整数数组 nums 和一个整数 k ，判断数组中是否存在两个 不同的索引 i 和 j ，满足 nums[i] == nums[j] 且 abs(i - j) &lt;= k 。如果存在，返回 true ；否则，返回 false 。



输入：nums = [1,2,3,1], k = 3
输出：true


二、思路


1 遍历数组nums，第1次出现的元素，将索引存入HashMap
2 大于1次出现的元素，计算和上次索引的绝对值：如果小于等于k返回true；如果大于k，就把...]]></description><category></category></item><item><title><![CDATA[java中基本数据类型、包装类、String类的相互转换]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124177214</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124177214</guid><author>Gnikay</author><pubDate>Thu, 14 Apr 2022 17:29:44 +0800</pubDate><description><![CDATA[基本数据类型：int、double、char、boolean等

包装类：Integer、Double、Character、Boolean

1 基本数据类型和包装类的相互转换—

&gt;基本数据类型转包装类：自动装箱(即直接赋值)


int a =8;

Integer b = a;

&gt;包装类转基本数据类型：自动拆箱(即直接赋值)


Integer b =10;

int a = b;

2 基本数据类型和String类的相互转换

&gt;基本数据类型转String类：String.v..]]></description><category></category></item><item><title><![CDATA[java中 == 和 equals() 的区别：个人总结]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124167285</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124167285</guid><author>Gnikay</author><pubDate>Thu, 14 Apr 2022 11:13:30 +0800</pubDate><description><![CDATA[1、==的使用

 ① 基本数据类型：比较的是值。值相等就true：

如：char a = ‘A’ a ==65 返回true

② 引用数据类型：比较的是地址值。类型不同直接false，类型相同看是否地址相同

2 equals()方法的使用

① equals()是个方法

② 只能引用数据类型调用，所以只能引用数据类型比较

③ 如果某个类没有重写equals()，默认还是比较地址值，结果同==

...]]></description><category></category></item><item><title><![CDATA[java - 53. 最大子数组和 - 动态规划]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124095119</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124095119</guid><author>Gnikay</author><pubDate>Mon, 11 Apr 2022 11:33:50 +0800</pubDate><description><![CDATA[一、题目

给你一个整数数组 nums ，请你找出一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。

子数组 是数组中的一个连续部分。



输入：nums = [-2,1,-3,4,-1,2,1,-5,4]
输出：6
解释：连续子数组[4,-1,2,1] 的和最大，为6 。



二、思路


1 确定状态
opt[i]表示以i为结尾的子数组中，最大连续子数组和，opt[0] = 0 ,opt[1] = 1
2 状态转移方程
opt[i] = max...]]></description><category></category></item><item><title><![CDATA[java中多态的个人理解和总结]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124050213</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124050213</guid><author>Gnikay</author><pubDate>Fri, 08 Apr 2022 20:34:24 +0800</pubDate><description><![CDATA[举例：Person p1 = new Man()；



 继承：在内存中，p1在栈中，是Person类型的，然后在堆中new一个Man对象。该对象加载了从Object一直到Person再到Man的所有属性和方法。这是因为new Man()的时候，会一直调用构造器中的super()，直到Object，这样Man对象中就存在了从自己到Person再到Object的所有属性和方法。

多态：当p1执行Man中的方法时，因为p1是Person类型的，因此p1只能执行p1中定义的方法。如果调用...]]></description><category></category></item><item><title><![CDATA[java - 105. 从前序与中序遍历序列构造二叉树 - 递归]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124044634</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124044634</guid><author>Gnikay</author><pubDate>Fri, 08 Apr 2022 16:27:12 +0800</pubDate><description><![CDATA[一、题目

给定两个整数数组 preorder 和 inorder ，其中 preorder 是二叉树的先序遍历， inorder 是同一棵树的中序遍历，请构造二叉树并返回其根节点。




输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]


二、思路


* 1 每次从preorder中拿到当前数组首部的数（这里我们用一个栈来实现），作为当前树根。

* 2 然后在inorder中找到该数的]]></description><category></category></item><item><title><![CDATA[java - 106. 从中序与后序遍历序列构造二叉树 - 递归]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124043876</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124043876</guid><author>Gnikay</author><pubDate>Fri, 08 Apr 2022 16:03:50 +0800</pubDate><description><![CDATA[一、题目

给定两个整数数组 inorder 和 postorder ，其中 inorder 是二叉树的中序遍历， postorder 是同一棵树的后序遍历，请你构造并返回这颗 二叉树 。




输入：inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出：[3,9,20,null,null,15,7]


二、思路


1 每次从postorder中拿到当前数组尾部的数（这里我们用一个栈来实现），作为当前树的根。
2 然后在inorder中找到该数的索]]></description><category></category></item><item><title><![CDATA[java - 108. 将有序数组转换为二叉搜索树]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124036728</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124036728</guid><author>Gnikay</author><pubDate>Fri, 08 Apr 2022 11:15:22 +0800</pubDate><description><![CDATA[一、题目

给你一个整数数组 nums ，其中元素已经按 升序 排列，请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。


输入：nums = [-10,-3,0,5,9]
输出：[0,-3,9,-10,null,5]
解释：[0,-10,5,null,-3,null,9] 也将被视为正确答案：










二、思路


  * 1 每次取数组的中间位置作为root，数组中root索引左边的作为左子树，右边...]]></description><category></category></item><item><title><![CDATA[java - 516. 最长回文子序列 - 动态规划四要素]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/124007556</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/124007556</guid><author>Gnikay</author><pubDate>Thu, 07 Apr 2022 11:10:49 +0800</pubDate><description><![CDATA[一、题目

给你一个字符串 s ，找出其中最长的回文子序列，并返回该序列的长度。

子序列定义为：不改变剩余字符顺序的情况下，删除某些字符或者不删除任何字符形成的一个序列。



输入：s = "bbbab"
输出：4
解释：一个可能的最长回文子序列为 "bbbb" 。




输入：s = "cbbd"
输出：2
解释：一个可能的最长回文子序列为 "bb" 。



二、思路（四要素）

1 、状态

使用 f[i][j] 表示字符串s索引 i 到索引 j 的子串中最长回文串的长度。

...]]></description><category></category></item><item><title><![CDATA[java- 122. 买卖股票的最佳时机 II - 时间O(n)空间O(1)]]></title><link>https://blog.youkuaiyun.com/Gnikay/article/details/123999574</link><guid>https://blog.youkuaiyun.com/Gnikay/article/details/123999574</guid><author>Gnikay</author><pubDate>Wed, 06 Apr 2022 20:58:23 +0800</pubDate><description><![CDATA[该题归类为动态规划，但是想到一个更好的实现方法：8行代码做到时间复杂度O(n)空间复杂度O(1)的算法实现：

一、题目

给定一个数组 prices ，其中 prices[i] 表示股票第 i 天的价格。

在每一天，你可能会决定购买和/或出售股票。你在任何时候最多只能持有 一股 股票。你也可以购买它，然后在 同一天 出售。
返回 你能获得的 最大 利润。


输入: prices = [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天（股票价格 = 1）的时候买入，在第 ...]]></description><category></category></item></channel></rss>