Kennem's Blog
  • 🏠主页
  • 🔍搜索
  • 📚文章
  • ⏱时间轴
  • 🔖标签
  • 🗂️分类
  • 🙋🏻‍♂️关于
主页 » 📚文章

💻技术

黑马头条(3)

黑马头条(3) 自媒体素材管理 素材管理-图片上传 图片上传路径: 实现代码: 通过ThreadLocal获取用户ID WmThreadLocalUtil src/main/java/com/heima/utils/thread/WmThreadLocalUtil.java public class WmThreadLocalUtil { private final static ThreadLocal<WmUser> WM_USER_THREAD_LOCAL = new ThreadLocal<>(); // 存入线程 public static void setUser(WmUser wmUser){ WM_USER_THREAD_LOCAL.set(wmUser); } // 从线程中获取 public static WmUser getUser(){ return WM_USER_THREAD_LOCAL.get(); } // 清理 public static void clear(){ WM_USER_THREAD_LOCAL.remove(); } } WmTokenInterceptor 定义拦截器 public class WmTokenInterceptor implements HandlerInterceptor { /** * 得到header中的用户信息后,并存入到当前线程中 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String userId = request.getHeader("userId"); if (userId != null) { WmUser wmUser = new WmUser(); wmUser.setId(Integer.valueOf(userId)); WmThreadLocalUtil.setUser(wmUser); } return true; } /** * 清理线程中的数据 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { WmThreadLocalUtil.clear(); } } WebMvcConfig 添加拦截器 ...

2024-12-15 · 4 分钟 · 1636 字 · updated: 2024-12-15 · ShowGuan

LeetCode 12/07 12/08 周赛/双周赛

LeetCode 12/07 12/08 周赛/双周赛 双周赛 T3 3377. 使两个整数相等的数位操作 题目总结: 给定两个整数 n 和 m,要求将 n 转变为 m,转变过程中需要满足以下条件: n 和 m 的数位长度相同; 可以对 n的数位执行以下操作: 将 n 中的任意一个 不是 9 的数位 增加 1; 将 n 中的任意一个 不是 0 的数位 减少 1; 转变过程中,n 任何中间状态都 不能是质数; 需要返回从 n 变为 m 的最小代价,代价为转变过程中所有 n 的值之和; 如果无法将 n 变为 m,返回 -1。 实现思路: 质数筛选: 使用线性筛法生成 1~10000 范围内的质数表,用布尔数组 st 标记每个数是否为质数,避免重复计算质数判断。 判断是否是质数: 定义函数 isPrime(x),通过 st[x] 快速判断一个数是否为质数。 特殊情况过滤: 如果 n 或 m 本身是质数,则直接返回 -1,因为无法满足条件。 最短路径求解: 使用 Dijkstra 算法 求解最小代价。 用优先队列(堆)存储当前的值和路径代价,起点为 n,终点为 m。 遍历当前数的每一位,分别尝试将该位增加或减少 1,生成新的数字 new_n: 如果 new_n 不为质数,并且更新的代价比当前已知代价更小,则将其加入堆中。 重复以上过程直到找到从 n 到 m 的最小代价。 返回结果: 如果在搜索中找到路径,返回最小代价;否则返回 -1 表示无法转换。 class Solution: def minOperations(self, n: int, m: int) -> int: N = 10000 primes = [] st = [False] * (N + 1) st[1] = True def sieve(n): for i in range(2, n + 1): if not st[i]: primes.append(i) for prime in primes: if i * prime > n: break st[i * prime] = True if i % prime == 0: break sieve(N) def isPrime(x): return not st[x] if isPrime(n) or isPrime(m): return -1 dis = [inf] * (N + 1) def dijkstra(): h = [(n, n)] dis[n] = n while h: dist, ver = heappop(h) if ver == m: return dist if dist > dis[ver]: continue str_n = list(str(ver)) for i in range(len(str_n)): ch = str_n[i] for delta in [-1, 1]: new_ch = chr(ord(ch) + delta) if '0' <= new_ch <= '9': new_n = int("".join(str_n[:i] + [new_ch] + str_n[i+1:])) if not isPrime(new_n) and dist + new_n < dis[new_n]: dis[new_n] = dist + new_n heappush(h, (dis[new_n], new_n)) return dis[m] res = dijkstra() return res if res < inf else -1 T4 3378. 统计最小公倍数图中的连通块数目 题目大意 题目给定一个整数数组 nums 和一个正整数 threshold,定义一张由 nums 的元素组成的图。如果两个节点对应的值 nums[i] 和 nums[j] 的最小公倍数(LCM)小于等于 threshold,则在图中将两个节点相连。要求返回图中 连通块的数量,即所有相互连通的节点组成的独立子图的数量。 ...

2024-12-08 · 6 分钟 · 2570 字 · updated: 2024-12-08 · ShowGuan

LeetCode Hot 100 精练🥸(2)

LeetCode Hot 100 精练🥸(2) 记忆中的东西一定会消退,真正留下的才是学到的,一定要及时回顾。 (21)139. 单词拆分 1、题目大意 给定字符串 s 和单词字典 wordDict,判断是否能用字典中的单词(可重复使用、无需全部使用)按顺序拼接得到 s。 ...

2024-12-08 · 37 分钟 · 18042 字 · updated: 2025-12-21 · ShowGuan

LeetCode Hot 100 精练🥸(2)

LeetCode Hot 100 精练🥸(2) 记忆中的东西一定会消退,真正留下的才是学到的,一定要及时回顾。 (41) 309. 买卖股票的最佳时机含冷冻期 class Solution: def maxProfit(self, prices: List[int]) -> int: n = len(prices) prices = [0] + prices f = [[-inf] * 3 for _ in range(n + 2)] # f[i][j] 第i天 距离上次卖出后第j天 f[1][2] = 0 # 入口,合法的情况 for i in range(1, n + 1): f[i][0] = max(f[i - 1][0], f[i][2] - prices[i]) # 第i天持有 f[i][1] = f[i - 1][0] + prices[i] # 今天买入,进入冷冻期 f[i + 1][2] = max(f[i - 1][1], f[i][2]) # 明天能达到非冷冻期的状态 return max(f[n][1], f[n + 1][2]) # 买股票后第一天,买股票后第大于等于2天 func maxProfit(prices []int) int { n := len(prices) f := make([][]int, n+2) inf := 0x3f3f3f3f for i := 0; i <= n+1; i += 1 { f[i] = make([]int, 3) for j := 0; j < 3; j += 1 { f[i][j] = -inf } } f[1][2] = 0 for i, p := range prices { f[i+1][0] = max(f[i][0], f[i+1][2]-p) f[i+1][1] = f[i][0] + p f[i+2][2] = max(f[i+1][2], f[i][1]) } return max(f[n][1], f[n+1][2]) } func max(a, b int) int { if a > b { return a } return b } (42)301. 删除无效的括号 class Solution: def removeInvalidParentheses(self, s: str) -> List[str]: res = [] def check(st): cnt = 0 for c in st: if c == "(": cnt += 1 elif c == ")": if cnt == 0: return False cnt -= 1 return cnt == 0 cur = set([s]) while True: for st in cur: if check(st): res.append(st) if len(res): break nxt = set() for st in cur: for i in range(len(st)): if i > 0 and st[i] == st[i - 1]: continue if st[i] == "(" or st[i] == ")": nxt.add(st[:i] + st[i + 1 :]) cur = nxt return res (43)300. 最长递增子序列 class Solution: def lengthOfLIS(self, nums: List[int]) -> int: n = len(nums) f = [1] * (n + 1) for i in range(n): for j in range(i, n): if nums[j] > nums[i]: f[j] = max(f[j], f[i] + 1) return max(f) (44)297. 二叉树的序列化与反序列化 class Codec: def serialize(self, root): if not root: return "#" return ( str(root.val) + " " + self.serialize(root.left) + " " + self.serialize(root.right) ) def deserialize(self, data): self.s = data return self.DerWork() def DerWork(self): if len(self.s) == 0: return None try: idx = self.s.index(" ") except: idx = -1 node = self.s if idx == -1 else self.s[:idx] self.s = "" if idx == -1 else self.s[idx + 1 :] if node == "#": return None t = TreeNode(int(node)) t.left = self.DerWork() t.right = self.DerWork() return t (45)287. 寻找重复数 class Solution: def findDuplicate(self, nums: List[int]) -> int: l, r = 0, len(nums) - 1 while l < r: mid = l + r >> 1 s = 0 for num in nums: if num > mid and num <= r: s += 1 if s > r - mid: l = mid + 1 else: r = mid return l (46)283. 移动零 class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ i, j = 0, 0 while j < len(nums): if nums[j]: if i != j: nums[i], nums[j] = nums[j], nums[i] i += 1 j += 1 (47)279. 完全平方数 class Solution: def numSquares(self, n: int) -> int: ls = [] i = 1 while True: if i**2 > n: break ls.append(i**2) i += 1 l = len(ls) f = [0] + [inf] * n for i in range(l): for j in range(ls[i], n + 1): f[j] = min(f[j], f[j - ls[i]] + 1) return f[n] (48)会议室 II class Solution: """ @param intervals: an array of meeting time intervals @return: the minimum number of conference rooms required """ def min_meeting_rooms(self, intervals: List[Interval]) -> int: # Write your code here d = defaultdict(int) #diff差分数组 for inter in intervals: s, e = inter.start, inter.end d[s] += 1 d[e] -= 1 s, res = 0, 0 for k, v in sorted(d.items()): s += v res = max(res, s) return res (49)240. 搜索二维矩阵 II class Solution: def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: m, n = len(matrix), len(matrix[0]) i, j = 0, n - 1 while i < m and j >= 0: if matrix[i][j] == target: return True if matrix[i][j] > target: j -= 1 elif matrix[i][j] < target: i += 1 return False (50)239. 滑动窗口最大值 class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: n = len(nums) q = deque() res = [] for i in range(n): while q and i - q[0] + 1 > k: q.popleft() while q and nums[q[-1]] <= nums[i]: q.pop() q.append(i) if i + 1 >= k: res.append(nums[q[0]]) return res (51)22. 括号生成 class Solution: def generateParenthesis(self, n: int) -> List[str]: res = [] ls = [] n *= 2 def dfs(i, l, r): if l > n // 2 or r > n // 2: return if i == n and l == r: res.append("".join(ls)) return ls.append("(") dfs(i + 1, l + 1, r) ls.pop() if r < l: ls.append(")") dfs(i + 1, l, r + 1) ls.pop() dfs(0, 0, 0) return res (52)49. 字母异位词分组 (53)48. 旋转图像 (54)46. 全排列 (55)42. 接雨水 (56)39. 组合总和 (57)543. 二叉树的直径 (58)34. 在排序数组中查找元素的第一个和最后一个位置 (59)33. 搜索旋转排序数组 (60)32. 最长有效括号 class Solution: """ @param intervals: an array of meeting time intervals @return: the minimum number of conference rooms required """ def min_meeting_rooms(self, intervals: List[Interval]) -> int: # Write your code here d = defaultdict(int) #diff差分数组 for inter in intervals: s, e = inter.start, inter.end d[s] += 1 d[e] -= 1 s, res = 0, 0 for k, v in sorted(d.items()): s += v res = max(res, s) return res func MinMeetingRooms(intervals []*Interval) int { // 差分数组:key 是时间点,value 是变化量 diff := make(map[int]int) for _, inter := range intervals { diff[inter.Start]++ diff[inter.End]-- } // 把时间点取出来排序 times := make([]int, 0, len(diff)) for t := range diff { times = append(times, t) } sort.Ints(times) cur, res := 0, 0 for _, t := range times { cur += diff[t] if cur > res { res = cur } } return res } 11. 盛最多水的容器 题目大意:给定一个长度为n的整数数组height,数组中的每个元素代表一条垂直线的高度。找出其中的两条线,使得它们与x轴构成的容器可以容纳最多的水。 ...

2024-12-08 · 23 分钟 · 11368 字 · updated: 2025-12-21 · ShowGuan

黑马头条(2)

黑马头条(2) 表结构分析 ap_article 文章基本信息表 ap_article_config 文章配置表 ap_article_content 文章内容表 三张表关系分析 从业务角度分析如何分表 滚屏分页的逻辑 表的拆分-垂直分表 垂直分表:将一个表的字段分散到多个表中,每个表存储其中一部分字段。 ...

2024-12-01 · 8 分钟 · 3797 字 · updated: 2024-12-01 · ShowGuan

LeetCode周赛425 & 144(241124)

LeetCode 11/24 11/25 周赛/双周赛 太长时间不参加周赛手生了很多,有时间就打,没时间刷熟 LeetCode Hot 100 + 面试题150 + LCR 双周赛 T3 3362. 零数组变换 III 题目大意 给定一个整数数组 nums 和二维数组 queries,每个操作 [li, ri] 可以将 nums[li] 到 nums[ri] 范围内的每个元素 最多减 1。 ...

2024-11-24 · 4 分钟 · 1939 字 · updated: 2024-11-24 · ShowGuan

黑马头条(1)

黑马头条(1) 微服务架构开发 Springboot Spring cloud Nacos Nacos 是一个由阿里巴巴开源的服务管理平台,专门用于微服务架构中的服务发现、配置管理和动态 DNS 服务。 环境搭建 目标:接口测试工具及前后端联调 类似今日头条 ...

2024-11-24 · 8 分钟 · 3916 字 · updated: 2024-11-24 · ShowGuan

面经(2)

面经(2) 腾讯面经 1. 自我介绍与项目 在自我介绍环节,建议突出以下几点: 背景和教育经历:说明你的专业、学校和毕业时间。如果有相关的学术成果或者奖项也可以提及。 实习和项目经验:重点介绍和面试岗位高度相关的实习或项目经历。比如,可以概括性地描述你负责的模块、使用的技术栈、解决的核心问题和取得的成效。 技术栈:可以具体介绍精通的编程语言(如Java、Python),掌握的框架或工具(如Spring Boot、Django),以及数据库和开发工具的经验(如MySQL、Git)。 项目细节:对于项目,可以选择一两个具有代表性的项目进行详细说明。建议结构如下: 项目背景及目标 你在项目中的角色及承担的主要工作 项目过程中遇到的挑战和你如何解决这些问题 项目的最终成果及其影响(数据和结果能帮助量化) 2. 操作系统 虚拟线程 虚拟线程(virtual thread)是现代编程语言(如Java)中为提高并发性能而引入的轻量级线程机制。相比传统线程,虚拟线程的创建和销毁代价更低,更适合高并发场景。 ...

2024-11-12 · 4 分钟 · 1557 字 · updated: 2024-11-12 · ShowGuan

RabbitMQ

RabbitMQ 同步通讯 和 异步通讯 同步调用 同步调用的问题: 拓展性差 性能下降 级联失败 异步调用 异步调用方式其实就是基于消息通知的方式,一般包含三个角色: 消息发送者:投递消息的人,就是原来的调用方 消息代理:管理、暂存、转发消息,可以理解为微信服务器 消息接收者:接受和处理消息的人,就是原来的服务提供方 支付服务不再同步调用业务关联度低的服务,而是发送消息通知到Broker。 ...

2024-11-05 · 11 分钟 · 5084 字 · updated: 2024-11-06 · ShowGuan

苍穹外卖前端开发(Day1)

苍穹外卖前端开发(Day1) node.js安装 配置全局下载包地址和缓存地址 npm config set prefix "E:x\nodejs\node_global" npm config set cache "E:\x\nodejs\node_cache" 最新的配置淘宝镜像的淘宝官方提供的方法 npm config set registry https://registry.npmmirror.com 安装Vue npm i @vue/cli -g 创建Vue项目 命令行创建(只能在cmd, 不能用powershell) vue create vue-demo-1 用网页的形式创建 vue ui Vue目录结构 node_modules:当前项目依赖的js包 assets:静态资源存放目录 components:公共组件存放目录 App.vue:项目的主组件,页面的入口文件 main.js:整个项目的入口文件 package.json:项目的配置信息、依赖包管理 vue.config.js:vue-cli配置文件 启动Vue项目工程 在Vue项目文件夹中: ...

2024-10-26 · 7 分钟 · 3134 字 · updated: 2024-10-26 · ShowGuan

苍穹外卖后端开发(Day12)

苍穹外卖后端开发(Day12) 工作台 名词解释: 营业额:已完成订单的总金额 有效订单:已完成订单的数量 订单完成率:有效订单数 / 总订单数 * 100% 平均客单价:营业额 / 有效订单数 新增用户:新增用户的数量 Apache POI Apache POI 是一个处理Microsoft Office 各种文件格式的开源项目。 ...

2024-10-24 · 3 分钟 · 1140 字 · updated: 2024-10-24 · ShowGuan

苍穹外卖后端开发(Day11)

苍穹外卖后端开发(Day11) Apache ECharts https://echarts.apache.org/zh/index.html 营业额统计 销量排名Top10 根据返回结果设计VO对象 SalesTop10ReportVO <select id="getSalesTop10" resultType="com.sky.dto.GoodsSalesDTO"> SELECT name, sum(od.number) number from order_detail od, orders o where od.order_id = o.id and o.status = 5 <if test="begin != null"> and o.order_time &gt; #{begin} </if> <if test="end != null"> and o.order_time &lt; #{end} </if> GROUP BY od.name ORDER BY number DESC LIMIT 10; </select>

2024-10-23 · 1 分钟 · 93 字 · updated: 2024-10-23 · ShowGuan

苍穹外卖后端开发(Day10)

苍穹外卖后端开发(Day10) Spring Task Spring Task 是 Spring 框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 cron 表达式 cron 表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间 ...

2024-10-21 · 2 分钟 · 799 字 · updated: 2024-10-21 · ShowGuan

苍穹外卖后端开发(Day7)

苍穹外卖后端开发(Day7) 缓存菜品 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问的压力随之增大。 实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 ...

2024-10-18 · 2 分钟 · 836 字 · updated: 2024-10-18 · ShowGuan

苍穹外卖后端开发(Day6)

苍穹外卖后端开发(Day6) HttpClient HttpClient是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。 ...

2024-10-17 · 3 分钟 · 1020 字 · updated: 2024-10-17 · ShowGuan
« 上一页  下一页  »
© 2026 Kennem's Blog · Powered by Hugo & PaperMod
👤 Visitors: 👀 Views: