一. 不定长滑动窗口不定长滑动窗口主要分为三类:求最长子数组,求最短子数组,以及求子数组个数。 1. 求最长子数组问题描述在满足特定条件的情况下,找到最长的连续子数组的长度。 解题技巧 双指针法:使用两个指针(通常为 left 和 right)来表示当前窗口的左右边界。 扩展与收缩: 扩展窗口:移动 right 指针,增加窗口的大小,直到窗口内的元素不再满足条件。 收缩窗口:移动 left 指针,缩小窗口的大小,直到窗口内的元素重新满足条件。 记录最大长度:在每次满足条件时,更新记录的最大窗口长度。 示例问题:给定一个整数数组和一个目标值 k,找到最长的子数组,使得子数组的和等于 k。 解题步骤: 初始化 left = 0,current_sum = 0,max_length = 0。 遍历数组,移动 right 指针: 将 nums[right] 加到 current_sum。 当 current_sum > k 时,移动 left 指针,并从 current_sum 中减去 nums[left],直到 current_sum <= k。 如果 current_ ...
课外开发
未读订单状态定时处理、来单提醒和客户催单 Spring Task介绍Spring Task 是 Spring 框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 应用场景: 信用卡每月还款提醒 银行贷款每月还款提醒 火车票售票系统处理未支付订单 入职纪念日为用户发送通知 cron 表达式cron 表达式其实就是一个字符串,通过 cron 表达式可以定义任务触发的时间 构成规则:分成 6 或 7 个域,由空格分隔开,每个域代表一个含义 每个域的含义分别为:秒、分钟、小时、日、月、周、年(可选) 例如:2024 年 10 月 17 日上午 10 点整 对应的 cron 表达式为:0 0 10 17 10 ?2024通常周跟日的位置会有一个问号一个日期 在线生成器:https://cron.ciding.cc/ 入门案例 导入 maven 坐标 spring-context(已存在) 启动类添加注解@EnableScheduling 开启任务调度 自定义定时任务类 订单状态定时处理处理超时订单1234567891011121314151617/** * 定时任务:处理超时订单 ...
有些文字,即使隔了多年,再看时,依然会触动不已。 从你的全世界路过 一个人的记忆就是座城市,时间腐蚀着一切建筑,把高楼和道路全部沙化。如果你不往前走,就会被沙子掩埋。所以我们泪流满面,步步回头,可是只能往前走。 2004 年的时候心灰意冷不想劳动,每天捧着电脑打牌,一打就是十几个钟头。但我的技术很差,毫无章法可言,唯一的优势是打字快,于是创造了自己的战术,叫作废话流。 一发牌,我就开始在聊天框里跟玩家说话:“赤焰天使,你娘舅最近身体好吗?”“天使为嘛是赤焰的呢,会炖熟的,你过日子要小心。”“咦,苍凉之心,好久不见你怎么改名字了?”“毛茸茸你好,帮帮我可以吗,我膝盖肿肿的呢……” 结果很多玩家忍无可忍,啪啪啪乱出牌,骂一句“我去你大爷的”就退出了。这样我靠打字赢了打牌,赚到胜率 75%。后来慢慢不管用,我又想了新招。 我在对话框里讲故事。 系统发牌,我打字:“从前有个神父,他住的村子里最美的姑娘叫小芳。突然小芳怀孕了,死也不肯说是谁的孩子。村民就暴打她,要将她浸猪笼。小芳哭着说,是神父的呢。村民一起冲进教堂,神父没有否认,任凭他们打断了自己的双腿。过了二十年,奇迹发生了。” 然 ...
解题技巧:定长滑窗问题 定长滑窗问题通常可以通过以下步骤解决: 初始化窗口统计量 定义一个变量来记录窗口内的统计量(如和、计数等)。 初始化窗口的统计量,通常是前 k 个元素的统计值。 滑动窗口遍历数组 使用一个循环,从第 k 个元素开始遍历数组。 在每次迭代中,执行以下三步操作: 入:将当前元素加入窗口,更新统计量。 更新:根据当前窗口的统计量,更新答案(如最大值、最小值、计数等)。 出:移除窗口左端的元素,更新统计量。 边界条件处理 确保数组长度大于或等于窗口大小 k。 根据题目要求,处理特殊情况(如空数组、无解等)。 优化 使用滑窗技术避免重复计算,确保时间复杂度为 O(n)。 模板代码: 1234567891011121314151617181920public int solveSlidingWindow(int[] nums, int k) { int n = nums.length; int result = 0; // 根据题目需求初始化答案 int windowSum = 0; // 窗 ...
1.两数之和II-输入有序数组 双向双指针 123456789101112131415161718192021222324252627282930package com.nianxi;import org.junit.jupiter.api.Test;import java.util.Arrays;public class LeetCode6Test { @Test public void test() { int[] numbers = {-1, 0}; int target = -1; System.out.println(Arrays.toString(twoSum(numbers, target))); } public int[] twoSum(int[] numbers, int target) { int left = 0; int right = numbers.length - 1; while (le ...
一. 两数之和 1234567891011121314151617181920212223242526272829303132package com.nianxi;import org.junit.jupiter.api.Test;import java.util.Arrays;/** * @author Jie. * @description: TODO 两数之和 * @date 2025/4/8 * @version: 1.0 */public class LeetCode1Test { @Test public void test() { int[] nums = {3,2,4}; int target = 6; System.out.println(Arrays.toString(twoSum(nums, target))); } public int[] twoSum(int[] nums, int target) { int lengt ...
大学生涯
未读商户查询缓存1. 利用互斥锁解决缓存击穿问题需求:修改根据id查询商铺的业务,基于互斥锁方式来解决缓存击穿问题 核心思路就是利用redis的setnx方法来表示获取锁,该方法含义是redis中如果没有这个key,则插入成功,返回1,在stringRedisTemplate中返回true, 如果有这个key则插入失败,则返回0,在stringRedisTemplate返回false,我们可以通过true,或者是false,来表示是否有线程成功插入key,成功插入的key的线程我们认为他就是获得到锁的线程。 12345678private boolean tryLock(String key) { Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key, "1", 10, TimeUnit.SECONDS); return BooleanUtil.isTrue(flag);}private void unlock(String key) { str ...
大学生涯
未读商户查询缓存1. 实现商铺和缓存与数据库双写一致有关概念在上一节已经介绍,这里直接写代码 需求:根据id查询店铺时,如果缓存未命中,则查询数据库,将数据库结果写入缓存,并设置超时时间,根据id修改店铺时,先修改数据库,再删除缓存设置redis缓存时添加过期时间queryById 根据id查询 12345678910111213141516171819202122@Servicepublic class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService { @Autowired private StringRedisTemplate stringRedisTemplate; @Override public Result queryById(Long id) { String key = CACHE_SHOP_KEY + id; String shopJson = stringRedisTemplat ...
大学生涯
未读一. 商户查询缓存1. 什么是缓存?缓存就是数据交换的缓冲区(称作Cache),是存贮数据的临时地方,一般读写性能较高。 缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘,缓存可以大大降低用户访问并发量带来的服务器读写压力。 但是缓存也会增加代码复杂度和运营的成本: 2. 添加商户缓存当我们根据id查询商户信息时,我们是直接操作从数据库中去进行查询的,所以我们需要增加缓存, 代码思路先从redis中查询数据,如果名命中,直接返回,如果没有,从数据库中查询,如果有的话添加到redis,直接返回,如果没有,返回查询失败或其他 代码12345678910111213141516171819202122@Servicepublic class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService { @Autowired private StringRedisTemplate stringRedisTemplate; @Overri ...
一.JAVA1.以下哪些线程是线程安全的?(ADE)A. Vector B. HashMap C. ArrayList D. StringBuffer E. Properties 解析: A. Vector是线程安全的动态数组实现,其所有的方法都被synchronized修饰,在多线程环境下可以安全使用,但是性能比ArrayList低 B. HashMap不是线程安全的,在多线程环境下可能出现数据不一致,需要线程安全可以使用ConcurrentHashMap或者Collections.synchronizedMap() C. ArrayList不是线程安全的,多线程环境可能出现并发修改异常 D. StringBuffer是线程安全的可变字符串类,其关键方法都被synchronized修饰,即同步,如果是单线程的话推荐使用StringBuilder E. Properties继承自HashTable,而HashTable是线程安全的实现,其所有方法都是同步的 2. 关于匿名内部类的特性有哪些?📌 基本概念 无类名:编译时自动生成名称(外部类$数字.cl ...