算法题记录
记录一些有价值的算法题,难度不会很高,可以拿来复健,例如熟悉编程语言的语法特性,在没有IDE的情况下能略写代码。
p394_字符串解码
字符串的相关操作
p347_前K个高频元素
PriorityQueue的自定义排序
动态规划题型整理
动态规划好难!题单:https://leetcode.cn/discuss/post/3581838/fen-xiang-gun-ti-dan-dong-tai-gui-hua-ru-007o/
1. 入门DP1.1. 爬楼梯70. 爬楼梯746. 使用最小花费爬楼梯3693. 爬楼梯 II 377. 组合总和 Ⅳ2466. 统计构造好字符串的方案数1.2. 打家劫舍198. 打家劫舍213. 打家劫舍 II2320. 统计放置房子的方式数740. 删除并获得点数1.3. 最大子数组和53. 最大子数组和2606. 找到最大开销的子字符串考虑一下空字符串的价值为0,也可能为最大值
1234567891011121314151617181920212223class Solution { private final Map<Character, Integer> mp = new HashMap<>(); public int maximumCostSubstring(String s, String chars, int[] vals) ...
算法题小整理
本文准备把常见的算法题中,不同的题型进行分类整理,相信将相同类型的思路放在一起能够起到事半功倍的效果。本分类很大程度参考了灵神的题单和题解,感谢灵神!
遍历+哈希表
两数之和梦开始的地方,利用哈希表将2次遍历简化为1次。我们采用枚举右,寻找左的方法,将当前遍历到的j作为两数中的一个,去哈希表中寻找左边的另一个数target - j,如果能找到就是一个解;然后将自身添加到哈希表中,等待后续右边的数来找自己。
12345678910111213class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> idx = new HashMap<>(); // 创建一个空哈希表 for (int j = 0; ; j++) { // 枚举 j int x = nums[j]; // 在左边找 nums[i],满足 nums[i]+x=target ...
力扣周赛记录
双周赛-174题一和题二都很简单直接秒了,可惜我昨天在看斯诺克,边看边做,就没打算做最后一道困难题了,其实挺简单的。以后尽量双周赛都参加一下,锻炼一下我的辣鸡算法能力。
题三:100918. 交替按位异或分割的数目题意:给一个数列数组,把他划分为若干个子数列,每个数列的异或和在target1和target2之间轮转。
之前对异或不够熟悉。异或是位运算,相同为0,不同为1,从而有:
自己异或自己为零,即:a ^ a = 0
异或的逆运算是自己,因此:若a ^ b = c则a = c ^ b,即abc任意两个进行异或都等于第三个。
这个题用前缀异或和(类似前缀和)的特性,设置2个dp数组分别是dp1和dp2,表示:dp1[sum](或dp2[sum])表示分割前缀异或和为sum的序列,分割成满足target1和target2交错,且最后一组的异或值为target1(或target2)的序列组的方法数;
这样之后,当遍历到输入参数nums的下标i时,此时dp1[sum]和dp2[sum]便表示:在下标i之前,分割前缀异或和为sum、且以target1或target2结尾的方法数。因此状态 ...
Java垃圾回收
复习:垃圾回收的主要区域就是 JVM 堆,也称堆内存。堆内存和方法区共同组成线程的共享区域。方法区存放类,堆存放对象。方法区在 JDK 1.8时被移动到本地内存中,不会收到 JVM 内存的限制。
类和对象的创建过程?线程私有区域有哪些?分别有什么用?
JVM 堆主要存放的是对象,它主要分为新生代和老年代(JDK1.8之前还有永久代暂时不做考虑),新生代又分为Eden和2个Suivivor区域。
分代回收机制_3代
Minor GC / Young GC:Eden放不下新创建的对象时触发,负责对新生代回收。Minor GC一般是用标记-复制算法,因为对象存活时间比较短。该算法首先回收Eden和Survivor中的垃圾对象,并将存活对象的年龄+1复制到空闲的S区;这些存活对象也可能被放到老年代去,具体得看对象的年龄阈值和S区剩余空间,即动态年龄计算。动态年龄计算:将S区的对象大小,从小到大依次累加,直到S区空间的一半,此时取min{该对象的年龄,年龄阈值}作为进入老年代的年龄基准;如果Eden区的对象太大,则直接放到老年代。
Major GC / ...
Java多线程
乐观锁和悲观锁悲观锁悲观锁在写操作频繁的场景下表现较好:共享资源被多个线程频繁地修改,悲观锁可以避免大量的重试和回滚操作。
synchronized
同步实例方法
修饰实例方法,是对象级别的锁,同一时间1个对象只能有1个同步实例方法在执行;但是非同步方法无所谓。
1public synchronized void decrement() {}
修饰类的静态方法
修饰静态方法,是类级别的锁,会锁定当前类的Class对象。同一时间只有一个线程可以执行该类的任何1个synchronized静态方法。
1public static synchronized void incrementStatic() {}
同步代码块:同步代码块提供了更细粒度的控制,允许你指定一个对象作为锁,只对代码块内的特定代码进行同步。
12345678910111213141516class BlockCounter { private int count = 0; private final Object lock = new Object( ...
Spring相关
什么是 Spring 和 SpringBootSpring 是什么Spring Framework 是很多模块的集合,使用这些模块可以很方便地协助我们进行开发;核心功能是 IoC 和 AOP。下图是 Spring 中各个模块之间的依赖关系。需要大概知道一些模块是干嘛的。
Core Container:基础模块,包含spring-core、spring-beans等
Data Access/Integration:数据访问模块,包含spring-jdbc、spring-orm等
Spring Web:网络部分,包含spring-webmvc、spring-websocket等等
Spring BootSpringBoot是用来快速开发Spring应用的一个脚手架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程;
SpringBoot提供了很多内置的Starter(⼀系列依赖关系的集合)结合自动配置,对主流框架如 Redis MySQL无需配置或开箱即用;
SpringBoot简化了开发,采用JavaConfig的方式可以使用零xml的方式进行开发,配置即 ...
JVM内存区域
总述主要分为运行时数据区域(JVM内存)和本地内存。
运行时数据区域(即**JVM内存**):JVM 规范中定义的所有内存区域的统称,是个逻辑区域。包含:
线程共享区域,包含“堆内存”、方法区(JDK1.7在共享区域,称为永久代;1.8之后被放到本地内存之中,称为元空间,但逻辑上仍属于JVM定义的规范之中)
线程私有区域,包含虚拟机栈、本地方法栈、程序计数器
本地内存:除去“运行时数据区域”后其余的物理内存
直接内存:特殊的一种内存缓冲区
元空间:是JVM规范中的“方法区”的一种实现,方法区是认为在JVM内存中的。JVM 的运行时数据区域 有固定大小上限,会受到JVM内存的限制;而放到本地内存后,只限制于系统可用的内存
JVM内存_线程私有区_3个程序计数器每个线程都有一个程序计数器,是当前线程所执行的字节码的行号指示器。字节码是JVM能识别的代码,是Java编译后形成的,并由在JVM上解释执行,它的代码是有行号的。可以通过如下命令查看:
12javac ClassName.javajavap -c -v ClassName
总结来说程序计数器的作用是:
...
Hadoop, Hive, Spark的关系详解
概念梳理参考Gemini:https://g.co/gemini/share/749bc1f75063
1. Hadoop
主要包含三部分:
1.1. HDFS即Hadoop Distributed FileSystem分布式文件系统,将大文件分割成小块并分发到集群的多个节点上。用户存取数据都是和单机一样的操作流程,但实际上这些数据都是在多台单机上存储的,即屏蔽了底层的分布式实现。
1.2. MapReduce单机之间的协同计算。Hadoop 早期主要的分布式计算模型,用于批处理任务。它将计算任务分解为 Map(映射)和 Reduce(规约)两个阶段。
MapReduce程序的代码比较复杂,需要自行编写,非常麻烦。因此出现了Hive和Pig等工具,而后续Hadoop的MapReduce部分就基本不用了,更多用的是它的HDFS文件系统。
1.3. YARN即ResourceManager,资源管理器。负责集群资源的调度和管理,包括 CPU、内存等。它使得不同的应用程序(如 MapReduce、Spark、Hive 等)可以共享同一个 Hadoop 集群的资源。
这个感觉不一定要划分为Ha ...
K8S部署主从复制MySQL和哨兵Redis
前置准备首先配置好K8S,并能保证节点之间的通信,可能需要配置网络插件,例如flannel,确保单机跑多副本的nginx是没问题的。
总共大约4步:
配置NFS
helm更换镜像
配置NFS123456> sudo apt update && sudo apt install nfs-kernel-server -y> sudo mkdir -p /mnt/nfs_share # 自定义你要共享的目录> sudo chown nobody:nogroup /mnt/nfs_share && sudo chmod 777 /mnt/nfs_share # 设置权限> vim /etc/exports # 编辑配置,添加在文件最后添加 /mnt/nfs_share *(rw,sync,no_subtree_check)> sudo exportfs -a # 导出配置> sudo systemctl restart nfs-kernel-server # 重启NFS服务
可以在另一台服务器上测试一下
1234567 ...








