<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Faker_Wang的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Faker_Wang</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Faker_Wang]]></copyright><item><title><![CDATA[算法题for THS]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/123595235</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/123595235</guid><author>Faker_Wang</author><pubDate>Sat, 19 Mar 2022 15:03:57 +0800</pubDate><description><![CDATA[第一题
穷尽集合之间的元素组合
public class THS01 {

    public static void main(String[] args) {
        List&lt;String&gt; list1 = new ArrayList&lt;&gt;();
        list1.add("1");
        list1.add("2");
        list1.add("3");
        List&lt;String&gt; list2 = new Ar]]></description><category></category></item><item><title><![CDATA[链表中环的入口结点--LeetCode第142题]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/112630907</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/112630907</guid><author>Faker_Wang</author><pubDate>Thu, 14 Jan 2021 21:43:51 +0800</pubDate><description><![CDATA[给一个链表，若其中包含环，请找出该链表的环的入口结点，否则，输出null。


题解：

快慢指针法，快指针一次走两步，慢指针一次走一步，当快慢指针第一次相遇，此时：    2（x+y）=n圈周长+x+y
相遇以后快指针回到head和慢指针以同样速度每次走一步，最终会在链表中环的入口结点处相遇。
这里可以这样理解， x + y = n圈周长， y =  n圈周长 - x; 快慢指针再继续走x后， 快指针走到入口点，此时慢指针再圆中走的路程为： x + y, 刚好为圆n圈周长。

package com.a.]]></description><category></category></item><item><title><![CDATA[两个链表的第一个公共节点 -剑指Offer第52题]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/111303293</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/111303293</guid><author>Faker_Wang</author><pubDate>Wed, 16 Dec 2020 21:25:40 +0800</pubDate><description><![CDATA[输入两个链表，找出它们的第一个公共节点。
如下面的两个链表：

注意：


如果两个链表没有交点，返回 null.
在返回结果后，两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度，且仅用 O(1) 内存。


解题思路：

可以先计算两个链表的长度，长度差为n，首先，比较长的链表header先往后移动n步，然后两个链表一起往后移动，如果一样，则为公共节点。

package com.alibaba.study.offer;

/**
 * @Auther: w]]></description><category></category></item><item><title><![CDATA[数组中的逆序对 - 剑指Offer第51题]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/111246084</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/111246084</guid><author>Faker_Wang</author><pubDate>Wed, 16 Dec 2020 09:50:17 +0800</pubDate><description><![CDATA[在数组中的两个数字，如果前面一个数字大于后面的数字，则这两个数字组成一个逆序对。输入一个数组，求出这个数组中的逆序对的总数。
示例 ：

输入: [7,5,6,4]
输出: 5

解题思路：

参考LeetCode解题思路：
https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/solution/shu-zu-zhong-de-ni-xu-dui-by-leetcode-solution/

package com.alibaba.s]]></description><category></category></item><item><title><![CDATA[合并K个升序链表 - LeetCode第23题]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/111183454</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/111183454</guid><author>Faker_Wang</author><pubDate>Mon, 14 Dec 2020 19:23:38 +0800</pubDate><description><![CDATA[给你一个链表数组，每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中，返回合并后的链表。
示例：

输入：lists = [[1,4,5],[1,3,4],[2,6]]
输出：[1,1,2,3,4,4,5,6]
解释：链表数组如下：
[
1-&gt;4-&gt;5,
1-&gt;3-&gt;4,
2-&gt;6
]
将它们合并到一个有序链表中得到。
1-&gt;1-&gt;2-&gt;3-&gt;4-&gt;4-&gt;5-&gt;6

提示：

k == lists.length
0 &lt;]]></description><category></category></item><item><title><![CDATA[Kafka位移提交以及CommitFailedException]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/111145743</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/111145743</guid><author>Faker_Wang</author><pubDate>Sun, 13 Dec 2020 21:56:36 +0800</pubDate><description><![CDATA[一、Kafka的消费位移
  Consumer 端有个位移的概念，它和消息在分区中的位移不是一回事儿，虽然它们的英文都是 Offset。它记录了Consumer 要消费的下一条消息的位移。这可能和你以前了解的有些出入，不过切记是下一条消息的位移，而不是目前最新消费消息的位移。Consumer 需要向 Kafka 汇报自己的位移数据，这个汇报过程被称为提交位移。从用户的角度来说，位移提交分为自动提交和手动提交；从 Consumer 端的角度来说，位移提交分为同步提交和异步提交。
  开启自动提交位移的方法很简]]></description><category></category></item><item><title><![CDATA[Kafka如何管理TCP连接]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/111143932</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/111143932</guid><author>Faker_Wang</author><pubDate>Sun, 13 Dec 2020 19:31:03 +0800</pubDate><description><![CDATA[一、Kafka消息生产
Kafka 的 Java 生产者 API 主要的对象就是KafkaProducer。通常我们开发一个生产者的步骤有 4 步。

第 1 步：构造生产者对象所需的参数对象。
第 2 步：利用第 1 步的参数对象，创建 KafkaProducer 对象实例。
第 3 步：使用 KafkaProducer 的 send 方法发送消息。
第 4 步：调用 KafkaProducer 的 close 方法关闭生产者并释放各种系统资源。

二、TCP连接管理
Java Producer 端管理 ]]></description><category></category></item><item><title><![CDATA[Kafka拦截器应用]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/111088167</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/111088167</guid><author>Faker_Wang</author><pubDate>Sun, 13 Dec 2020 07:58:29 +0800</pubDate><description><![CDATA[一、Kafka拦截器
 Kafka 拦截器分为生产者拦截器和消费者拦截器。生产者拦截器允许你在发送消息前以及消息提交成功后植入你的拦截器逻辑；而消费者拦截器支持在消费消息前以及提交位移后编写特定逻辑。值得一提的是，这两种拦截器都支持链的方式，即你可以将一组拦截器串连成一个大的拦截器，Kafka 会按照添加顺序依次执行拦截器逻辑。

如果需要加AddTimestampInterceptor和UpdateCounterInterceptor两个拦截器，可以这样配置
Properties props = new ]]></description><category></category></item><item><title><![CDATA[十大经典排序算法]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/111052236</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/111052236</guid><author>Faker_Wang</author><pubDate>Fri, 11 Dec 2020 19:54:05 +0800</pubDate><description><![CDATA[一、算法分类
十种常见排序算法可以分为两大类：

比较类排序：通过比较来决定元素间的相对次序，由于其时间复杂度不能突破O(nlogn)，因此也称为非线性时间比较类排序。
非比较类排序：不通过比较来决定元素间的相对次序，它可以突破基于比较排序的时间下界，以线性时间运行，因此也称为线性时间非比较类排序。
-


...]]></description><category></category></item><item><title><![CDATA[括号生成 - LeetCode第22题]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/111035213</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/111035213</guid><author>Faker_Wang</author><pubDate>Fri, 11 Dec 2020 14:50:39 +0800</pubDate><description><![CDATA[数字 n 代表生成括号的对数，请你设计一个函数，用于能够生成所有可能的并且 有效的 括号组合。
示例：

输入：n = 3
输出：[
  “((()))”,
 “(()())”,
  “(())()”,
  “()(())”,
   “()()()”
]

解题思路：

采用递归的思路，每个位置放置一个字符，可能是“（”，也可能是“）”，但是左右括号数量不允许超过 n, 右括号数量在放置的时候，不允许超过左括号数量。

package com.alibaba.study.leetcode;

import ]]></description><category></category></item><item><title><![CDATA[Kafka之无消息丢失配置怎么实现]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/111033758</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/111033758</guid><author>Faker_Wang</author><pubDate>Fri, 11 Dec 2020 13:51:11 +0800</pubDate><description><![CDATA[如何实现Kafka不丢消息？

Kafka 只对“已提交”的消息（committed message）做有限度的持久化保证。


不要使用 producer.send(msg)，而要使用 producer.send(msg, callback)。记住，一定要使用带有回调通知的 send 方法。
设置 acks = all。acks 是 Producer 的一个参数，代表了你对“已提交”消息的定义。如果设置成 all，则表明所有副本 Broker 都要接收到消息，该消息才算是“已提交”。这是最高等级的“已提交]]></description><category></category></item><item><title><![CDATA[Kafka基础（二）]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/111031457</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/111031457</guid><author>Faker_Wang</author><pubDate>Fri, 11 Dec 2020 11:17:56 +0800</pubDate><description><![CDATA[一、Kafka分区
  Kafka 的消息组织方式实际上是三级结构：主题 - 分区 - 消息。主题下的每条消息只会保存在某一个分区中，而不会在多个分区中被保存多份。
  分区的作用就是提供负载均衡的能力，或者说对数据进行分区的主要原因，就是为了实现系统的高伸缩性（Scalability）。不同的分区能够被放置到不同节点的机器上，而数据的读写操作也都是针对分区这个粒度而进行的，这样每个节点的机器都能独立地执行各自分区的读写请求处理。并且，我们还可以通过添加新的节点机器来增加整体系统的吞吐量。除了提供负载均衡这]]></description><category></category></item><item><title><![CDATA[Kafka基础（一）]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/110966040</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/110966040</guid><author>Faker_Wang</author><pubDate>Thu, 10 Dec 2020 19:39:52 +0800</pubDate><description><![CDATA[一、基本术语
消息：Record。Kafka 是消息引擎嘛，这里的消息就是指 Kafka 处理的主要对象。
主题：Topic。主题是承载消息的逻辑容器，在实际使用中多用来区分具体的业务。
分区：Partition。一个有序不变的消息序列。每个主题下可以有多个分区。消息位移：Offset。表示分区中每条消息的位置信息，是一个单调递增且不变的值。
副本：Replica。Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余，这些地方就是所谓的副本。副本还分为领导者副本和追随者副本，各自有不同的角色划分。副本]]></description><category></category></item><item><title><![CDATA[电话号码的字母组合 - LeetCode第17题]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/110841874</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/110841874</guid><author>Faker_Wang</author><pubDate>Mon, 07 Dec 2020 21:15:22 +0800</pubDate><description><![CDATA[给定一个仅包含数字 2-9 的字符串，返回所有它能表示的字母组合。
给出数字到字母的映射如下（与电话按键相同）。注意 1 不对应任何字母。

示例：

输入：“23”
输出：[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].

解题思路：

可以按照递归的思路解题，递归遍历每一个数值，每个数字取一个字母，拼接起来。

import com.alibaba.fastjson.JSON;
import java.util.Calendar;
impor]]></description><category></category></item><item><title><![CDATA[最接近的三数之和 - LeetCode第16题]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/110823961</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/110823961</guid><author>Faker_Wang</author><pubDate>Mon, 07 Dec 2020 18:49:09 +0800</pubDate><description><![CDATA[ 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数，使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。


3 &lt;= nums.length &lt;= 10^3
-10^3 &lt;= nums[i] &lt;= 10^3
-10^4 &lt;= target &lt;= 10^4


示例

输入：nums = [-1,2,1,-4], target = 1
输出：2
解释：与 target 最接近的和是 2 (]]></description><category></category></item><item><title><![CDATA[整数转罗马数字 - LeetCode第12题]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/110596581</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/110596581</guid><author>Faker_Wang</author><pubDate>Thu, 03 Dec 2020 23:52:24 +0800</pubDate><description><![CDATA[罗马数字包含以下七种字符： I， V， X， L，C，D 和 M。

字符                    数值
I                            1
V                            5
X                         10
L                           50
C                       100
D                            500
M            ]]></description><category></category></item><item><title><![CDATA[字符串转整数 - LeetCode第8题]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/110483123</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/110483123</guid><author>Faker_Wang</author><pubDate>Wed, 02 Dec 2020 15:39:04 +0800</pubDate><description><![CDATA[请你来实现一个 atoi 函数，使其能将字符串转换成整数。
首先，该函数会根据需要丢弃无用的开头空格字符，直到寻找到第一个非空格的字符为止。接下来的转化规则如下：

如果第一个非空字符为正或者负号时，则将该符号与之后面尽可能多的连续数字字符组合起来，形成一个有符号整数。
假如第一个非空字符是数字，则直接将其与之后连续的数字字符组合起来，形成一个整数。
该字符串在有效的整数部分之后也可能会存在多余的字符，那么这些字符可以被忽略，它们对函数不应该造成影响。
注意：假如该字符串中的第一个非空格字符不是一个有效整数]]></description><category></category></item><item><title><![CDATA[设计模式之行为型（一）]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/110318789</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/110318789</guid><author>Faker_Wang</author><pubDate>Mon, 30 Nov 2020 08:54:32 +0800</pubDate><description><![CDATA[一、观察者模式
  观察者模式的应用场景非常广泛，小到代码层面的解耦，大到架构层面的系统解耦，再或者一些产品的设计思路，都有这种模式的影子，比如，邮件订阅、RSS Feeds，本质上都是观察者模式。不同的应用场景和需求下，这个模式也有截然不同的实现方式，有同步阻塞的实现方式，也有异步非阻塞的实现方式；有进程内的实现方式，也有跨进程的实现方式。
public interface RegObserver{
    void handleRegSuccess(long userId);
}

public cla]]></description><category></category></item><item><title><![CDATA[设计模式之结构型]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/110286784</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/110286784</guid><author>Faker_Wang</author><pubDate>Sun, 29 Nov 2020 10:06:35 +0800</pubDate><description><![CDATA[一、代理模式
  在不改变原始类（或叫被代理类）的情况下，通过引入代理类来给原始类附加功能。一般情况下，我们让代理类和原始类实现同样的接口。但是，如果原始类并没有定义接口，并且原始类代码并不是我们开发维护的。在这种情况下，我们可以通过让代理类继承原始类的方法来实现代理模式。
  静态代理需要针对每个类都创建一个代理类，并且每个代理类中的代码都有点像模板式的“重复”代码，增加了维护成本和开发成本。对于静态代理存在的问题，我们可以通过动态代理来解决。我们不事先为每个原始类编写代理类，而是在运行的时候动态地创建原]]></description><category></category></item><item><title><![CDATA[设计模式之创建型]]></title><link>https://blog.youkuaiyun.com/Faker_Wang/article/details/110248532</link><guid>https://blog.youkuaiyun.com/Faker_Wang/article/details/110248532</guid><author>Faker_Wang</author><pubDate>Fri, 27 Nov 2020 23:40:51 +0800</pubDate><description><![CDATA[一、单例模式
  单例设计模式（Singleton Design Pattern）理解起来非常简单。一个类只允许创建一个对象（或者实例），那这个类就是一个单例类，这种设计模式就叫作单例设计模式，简称单例模式。
实现方式：

饿汉模式

public class IdGenerator{ 
	private AtomicLong id = new 	AtomicLong(0);privatestaticfinal IdGenerator instance = new IdGenerator();private]]></description><category></category></item></channel></rss>