Skip to content

Instantly share code, notes, and snippets.

View pandening's full-sized avatar

Jian Hu pandening

View GitHub Profile
@pandening
pandening / 系统设计案例积累.md
Created May 31, 2020 04:13
会在这个gist里面放一些系统设计的案例,包括系统分析,架构设计,要点分析,高可用运维方案等内容

系统设计是评估一个工程师是否优秀的重要指标之一,系统设计涉及到的面非常广,可以发挥的地方比较多,通过系统设计,不仅可以看出是否具备架构设计能力,还可以 通过一些细节点的深入考虑看出对某些特定问题的思考能力,也就是说,系统设计不仅可以看出工程师的技术广度,还可以看出过工程师的技术深度:

  • 广度:比如是否可以在合适的场景下提出使用合理的技术方案,包括使用到的技术组件,方案流程等,如果广度超过一定阈值,则可以界定为架构师
  • 深度:比如明确知道某种组件的技术原理,并能预知到未来可能存在的风险等,或者对某种场景非常在行,比如分布式系统设计与实现;
@pandening
pandening / 正则表达式.md
Created May 22, 2020 15:33
正则表达式的动态规划做法

解题思路

定义:$dp[i][j]$表示s的前i个字母和p的前j个字符是否匹配,则考虑p[j]是否是'*',如果不是的话,那么就 正常判断p[j]和s[i]就可以,否则就需要枚举p[j - 1]匹配多个s[i]字符;所以,下面来考虑匹配若干个s[i] 这种方案的情况:

  • 首先,假设匹配0个,那么$dp[i][j] = dp[i][j - 2]$,表示不做匹配,直接去掉'*'和前面的一个字符即可
  • 匹配一个,那么$dp[i][j] = dp[i - 1][j - 2] && s[i] 和 p [j - 1]匹配$
  • 匹配两个,那么$dp[i][j] = dp[i - 2][j - 2] && s[i] 匹配 p[j - 1] && s[i - 1] 匹配 p[j - 1]$
  • 匹配k个,那么$dp[i][j] = dp[i - k][j - 2] && s[i - k:i] 匹配 p[j - 1]$
@pandening
pandening / 二分查找.md
Created May 4, 2020 16:17
二分查找算法框架

二分查找的步骤

  • 确认l、r
  • 确定check函数
  • 根据check函数更新l和r

通用算法框架

使用动态规划来完成所有这类题目

状态表示

在dp问题中,首先要解决的就是状态表示,状态表示需要解决的是问题集合的定义的问题,也就是我们需要定义一个集合,然后明确集合的含义,以及状态存储的属性是 什么,我们仔细分析一下LeetCode上股票交易相关的题目,可以找到下面几个关键点:

  • 价格日历,每天的价格是不一样的;
  • 允许交易的次数,有可能只允许交易一次,可能允许交易2次,或者无限次;
  • 交易可能存在交易费率,每一笔交易都需要交付一定的费率;
  • 交易冷冻期,也就是交易连续性问题;
@pandening
pandening / 背包问题理解.md
Last active March 6, 2020 11:31
pack of dp problem

1、01背包问题

1.1 原型题目

有N件物品和一个容量为V的背包,放入第i件物品需要占用C(i)的空间,可以获得W(i)的价值,求解将哪些物品装入背包可以使得背包中物品的价值总和最大。

1.2 基本思路

这是最基本的背包问题,也就是01背包问题,所谓01背包问题,就是对于每一个物品,要么选择放入背包,要么不选;可以使用子问题来定义状态: F[i,v] :表示前i件物品放入一个容量为v的背包可以获得的最大价值,那么可以得出状态转移方程:

@pandening
pandening / mybatis ${} vs #{}
Created February 13, 2019 11:31
mybatis ${} vs #{}
${} :用于直接替换内容,容易被sql注入,但是也有适用场景,比如 select * from ${table_name},这个时候就不能使用 #{table_name},否则sql语句会有语法问题
#{} :用于指定某个值,加引号,避免sql注入;
总结:
*(1)、能使用#{}就使用#{}
*(2)、设置值使用#{},sql语法相关使用${}
@pandening
pandening / NativeCommandUtil.java
Created January 6, 2019 12:53
使用java执行一些native命令,并等待返回结果
package common;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/**
* You can run native command by this util.
@pandening
pandening / cache.md
Created December 25, 2018 07:22
cache , local, remote;

缓存client套路

1、缓存不能读到脏数据 2、缓存可能读到过期数据,是否可以容忍一段时间的不一致性,但是可以保证最终一致性(只是达到最终一致性的时间长短不一样)

client缓存套路及存在的问题:

  • 先更新数据库,再更新缓存

存在的问题:可能读到脏数据

@pandening
pandening / HotSpot.md
Last active October 8, 2021 06:38
HotSpot JVM Comment List

HotSpot

  • GC
  • JNI
  • JIT
  • JVMTI
  • etc,.
@pandening
pandening / HashMapPutVal.java
Last active November 10, 2018 04:59
探索HashMap的PutVal方法的执行流程
/**
* Associates the specified value with the specified key in this map.
* If the map previously contained a mapping for the key, the old
* value is replaced.
*
* @param key key with which the specified value is to be associated
* @param value value to be associated with the specified key
* @return the previous value associated with <tt>key</tt>, or
* <tt>null</tt> if there was no mapping for <tt>key</tt>.
* (A <tt>null</tt> return can also indicate that the map