当前位置: 首页 > news >正文

贪心与单调栈的艺术:从三道 LeetCode 题看最小字典序问题(316/402/1081)

前言

欢迎来到我的算法探索博客,在这里,我将通过解析精选的LeetCode题目,与您分享深刻的解题思路、多元化的解决方案以及宝贵的实战经验,旨在帮助每一位读者提升编程技能,领略算法之美。
👉更多高频有趣LeetCode算法题

在字符串处理的众多问题中,“最小字典序”是一类典型的优化问题,要求我们在一系列操作约束下构造出字典序最小的字符串。LeetCode 316(去除重复字母)、402(移掉 K 位数字)、1081(不同字符的最小子序列)这三道题,尽管表面上考察的内容不同,但都围绕着同一个核心目标:如何在给定条件下,使最终结果的字典序尽可能小。

解决这类问题的关键在于 贪心策略 + 单调栈。贪心策略的核心思想是每一步都选择当前最优解,确保最终答案的整体最优;单调栈则用于维护一个满足字典序要求的递增结构,同时保证结果的合法性,例如去重或限制字符个数。通过合理地运用这两种技巧,我们可以在遍历过程中动态调整答案,确保最终构造出的字符串是全局最优的。

这一策略不仅适用于字符串去重(如 316、1081),还可以用于数字最小化(如 402),甚至在更广泛的子序列优化问题中也有所应用。本文将通过对这三道题的详细解析,帮助你掌握 贪心 + 单调栈 在最小字典序问题中的应用,让你在面对类似问题时能够迅速找到最佳解法。

402. 移掉 K 位数字316. 去除重复字母
1081. 不同字符的最小子序列/

实战:经典例题讲解

402. 移掉 K 位数字

🪴题目描述

在这里插入图片描述

🍁核心思路

1. 贪心策略 + 单调栈
  • 核心思想:要让最终的数值最小,高位数字尽可能小是关键。因此,我们需要从左到右遍历字符串,在允许删除 k 次的前提下,尽可能让高位数字更小。
  • 单调栈的作用:使用 StringBuilder 模拟一个单调非递减栈。遍历过程中,如果当前字符比栈顶字符小,且还有删除次数(k > 0),就不断弹出栈顶字符(删除高位较大的数字),直到栈顶字符不大于当前字符。

2. 遍历字符串,动态调整栈
  • 具体步骤
    1. 遍历每个字符时,检查栈顶字符是否比当前字符大:
      • 如果是,则弹出栈顶字符(相当于删除一个高位较大的数字),并减少 k
      • 重复这一过程,直到栈顶字符不大于当前字符,或者 k 用完。
    2. 将当前字符加入栈中。
  • 示例
    输入 num = "1432219", k = 3
    • 遍历到 '4' 时,栈为 ['1']'1' < '4',直接加入 → ['1', '4']
    • 遍历到 '3' 时,发现 '4' > '3',删除 '4'k=2),栈变为 ['1'],加入 '3'['1', '3']
    • 遍历到 '2' 时,发现 '3' > '2',删除 '3'k=1),栈变为 ['1'],加入 '2'['1', '2']
    • 最终结果为 "12219",删除剩余 k=1 次末尾字符 → "1219"

3. 处理剩余的删除次数
  • 如果遍历完字符串后,k 仍未用完(例如原字符串已经是单调递增的),则直接从栈末尾删除剩余的 k 位,因为末尾的数字是最大的,删除它们对数值影响最小。
    • 示例:num = "12345", k = 2 → 删除末尾两位 '4', '5',结果为 "123"

4. 处理前导零
  • 删除所有前导零(例如 "0200""200")。
  • 如果结果为空或全为零,返回 "0"

🌏代码实现

Java
class Solution {public String removeKdigits(String num, int k) {StringBuilder sb = new StringBuilder();for (char a : num.toCharArray()) {while (k > 0 && sb.length() > 0 && sb.charAt(sb.length() - 1) > a) {k--;sb.deleteCharAt(sb.length() - 1);}sb.append(a);}// 如果 k 仍然大于 0,需要继续删除最后的 k 个字符while (k > 0 && sb.length() > 0) {sb.deleteCharAt(sb.length() - 1);k--;}// 移除前导零int start = 0;for (int i = 0; i < sb.length(); i++) {if (sb.charAt(i) == '0')start++;elsebreak;}// 如果 sb 为空或全是 0,则返回 "0"String result = sb.substring(start);return result.isEmpty() ? "0" : result;}
}

Python
class Solution:def removeKdigits(self, num, k):result = []for c in num:while k > 0 and result and result[-1] > c:result.pop()k -= 1result.append(c)# 如果 k 仍然大于 0,删除最后的 k 个字符result = result[:-k] if k else result# 移除前导零finalResult = "".join(result).lstrip('0')return finalResult if finalResult else "0"

C++
class Solution {
public:string removeKdigits(string num, int k) {string result;for (char c : num) {while (k > 0 && !result.empty() && result.back() > c) {result.pop_back();k--;}result.push_back(c);}// 如果 k 仍然大于 0,删除最后的 k 个字符while (k > 0 && !result.empty()) {result.pop_back();k--;}// 移除前导零int start = 0;while (start < result.size() && result[start] == '0') {start++;}// 构造最终字符串string finalResult = result.substr(start);return finalResult.empty() ? "0" : finalResult;}
};

316. 去除重复字母

1081. 不同字符的最小子序列

🪴题目描述

这俩题基本上一致,换个方法名就行。

在这里插入图片描述

🍁核心思路(针对Java)

1. 统计字符出现次数
  • 首先,我们需要知道每个字符在字符串中出现的次数,以便后续判断是否可以移除某个字符(如果后面还有相同的字符,就可以放心移除当前字符)。
  • 使用一个 Map<Character, Integer> 来记录每个字符的剩余次数。

2. 维护单调递增栈
  • 我们需要一个栈(这里用 StringBuilder 模拟栈)来构建最终的结果。这个栈的特点是 单调递增,也就是说,栈中的字符是按字典序从小到大排列的。
  • 遍历字符串时,对于每一个字符:
    • 如果它已经在栈中(通过 isUsed 数组标记),则直接跳过,因为题目要求去重。
    • 如果它不在栈中,则需要决定是否将其加入栈中。

3. 贪心策略:弹出栈顶字符
  • 在将当前字符加入栈之前,我们需要检查栈顶的字符是否比当前字符大,并且栈顶字符在后面还会出现(通过 map 判断剩余次数)。
    • 如果满足条件,说明栈顶字符可以被移除,因为后面还有机会再次加入它。这样做的目的是让字典序更小。
    • 弹出栈顶字符后,需要将其标记为未使用(isUsed 数组更新)。

4. 加入当前字符
  • 当栈顶字符不再比当前字符大,或者栈顶字符后面不会再出现时,将当前字符加入栈中,并标记为已使用。

5. 返回结果
  • 最终,栈中的字符就是去重后字典序最小的结果。

示例

以字符串 "cbacdcbc" 为例:

  1. 遍历到 'c',加入栈中,栈为 ['c']
  2. 遍历到 'b',发现 'c''b' 大且后面还有 'c',弹出 'c',加入 'b',栈为 ['b']
  3. 遍历到 'a',发现 'b''a' 大且后面还有 'b',弹出 'b',加入 'a',栈为 ['a']
  4. 遍历到 'c',加入栈中,栈为 ['a', 'c']
  5. 遍历到 'd',加入栈中,栈为 ['a', 'c', 'd']
  6. 遍历到 'c''c' 已经在栈中,跳过。
  7. 遍历到 'b',加入栈中,栈为 ['a', 'c', 'd', 'b']
  8. 遍历到 'c''c' 已经在栈中,跳过。

最终结果为 "acdb"


通过这种 贪心 + 单调栈 的方法,我们能够高效地解决问题,同时保证结果的字典序最小。

🌏代码实现

Java
class Solution {public String removeDuplicateLetters(String S) {// 统计每个字母的出现次数char[] s = S.toCharArray();Map<Character, Integer> map = new HashMap<>();for (char a : s) {map.put(a, map.getOrDefault(a, 0) + 1);}StringBuilder sb = new StringBuilder();boolean[] isUsed = new boolean[26];for (char sss : s) {map.put(sss, map.get(sss) - 1);  // 直接获取值,无需 getOrDefaultif (isUsed[sss - 'a']) continue; // 如果已经在结果中,则跳过// 维护一个单调递增栈while (sb.length() > 0 && sb.charAt(sb.length() - 1) > sss && map.get(sb.charAt(sb.length() - 1)) > 0) {isUsed[sb.charAt(sb.length() - 1) - 'a'] = false; // 标记移除的字符为未使用sb.deleteCharAt(sb.length() - 1);}sb.append(sss);isUsed[sss - 'a'] = true; // 标记该字符已经被使用}return sb.toString();}
}

Python
class Solution(object):def removeDuplicateLetters(self, s):count = Counter(s)is_used = set()result = []for c in s:count[c] -= 1if c in is_used:continuewhile result and result[-1] > c and count[result[-1]] > 0:is_used.remove(result.pop())result.append(c)is_used.add(c)return ''.join(result)

C++
class Solution {
public:string removeDuplicateLetters(string s) {unordered_map<char, int> count;vector<bool> isUsed(26, false);for (char c : s) {count[c]++;}string result;for (char c : s) {count[c]--;if (isUsed[c - 'a']) continue;while (!result.empty() && result.back() > c && count[result.back()] > 0) {isUsed[result.back() - 'a'] = false;result.pop_back();}result.push_back(c);isUsed[c - 'a'] = true;}return result;}
};

结语

这三道题看似不同,但本质上都是在解决一个问题:如何构造字典序最小的字符串。它们的核心思路都是 贪心 + 单调栈,通过维护一个递增的结构,在每一步选择当前最优的字符,同时确保后续字符仍然满足条件。

  • 316 和 1081 的重点是去重,确保每个字符只出现一次,同时让字典序最小。
  • 402 则是通过删除数字来让数值最小,虽然不需要去重,但同样需要保证每一步的选择是最优的。

无论是去掉重复字符、删掉多余数字,还是优化子序列,这套方法都能帮我们高效地找到最优解。掌握了 贪心 + 单调栈 的思路,这类问题就能迎刃而解了!


如果您渴望探索更多精心挑选的高频LeetCode面试题,以及它们背后的巧妙解法,欢迎您访问我的博客,那里有我精心准备的一系列文章,旨在帮助技术爱好者们提升算法能力与编程技巧。

👉更多高频有趣LeetCode算法题

在我的博客中,每一篇文章都是我对算法世界的一次深入挖掘,不仅包含详尽的题目解析,还有我个人的心得体会、优化思路及实战经验分享。无论是准备面试还是追求技术成长,我相信这些内容都能为您提供宝贵的参考与启发。期待您的光临,让我们共同在技术之路上不断前行!

相关文章:

贪心与单调栈的艺术:从三道 LeetCode 题看最小字典序问题(316/402/1081)

前言 欢迎来到我的算法探索博客&#xff0c;在这里&#xff0c;我将通过解析精选的LeetCode题目&#xff0c;与您分享深刻的解题思路、多元化的解决方案以及宝贵的实战经验&#xff0c;旨在帮助每一位读者提升编程技能&#xff0c;领略算法之美。 &#x1f449;更多高频有趣Lee…...

rabbitMQ消息转换器

消息转换器 Spring的消息发送代码接收的消息体是一个Object&#xff1a; 而在数据传输时&#xff0c;它会把你发送的消息序列化为字节发送给MQ&#xff0c;接收消息的时候&#xff0c;还会把字节反序列化为Java对象。 只不过&#xff0c;默认情况下Spring采用的序列化方式是J…...

力扣-字符串-541 反转字符串Ⅱ

思路 和《反转字符串》的代码类似&#xff0c;只是每次处理2k个 代码 class Solution { public:string reverseStr(string s, int k) {int length s.length();int reverse 0;while(reverse < length){int left, right;if(reverse k < length){left reverse, right…...

CSS(三)less一篇搞定

目录 一、less 1.1什么是less 1.2Less编译 1.3变量 1.4混合 1.5嵌套 1.6运算 1.7函数 1.8作用域 1.9注释与导入 一、less 1.1什么是less 我们写了这么久的CSS,里面有很多重复代码&#xff0c;包括通配颜色值、容器大小。那我们能否通过js声明变量来解决这些问题&…...

GT 接口时钟

每个 GT 接口需要几个时钟&#xff0c;包括一些共享时钟&#xff0c;这些时钟在位于一个或多个 GT quad 中的绑定 GT*_CHANNEL 单元之间共享。 UltraScale 器件提供高达 128 个 GT*_CHANNEL site 位置&#xff0c;这可能导致在设计中使用几百个时钟。大多数 GT 时钟具…...

算法日记13:SC41树状数组(区间修改)

一、题目&#xff1a; 二、题解&#xff1a; 在单点修改中&#xff0c;我们用t[i]来维护原数组2.1:在区间修改中&#xff0c;我们将维护原数组的差分数组 接下来&#xff0c;让我们来回顾一些差分的性质 此时&#xff0c;假设我们需要求 a 1 a 2 a 3 a 4 a1a2a3a4 a1a2a3a…...

【STM32】串口原理

单片机有自己的RX&#xff08;接收端&#xff09;&#xff0c;TX&#xff08;发送端&#xff09;&#xff0c;有的需要再共同接一个底线&#xff0c;为了保证有相同的参考电势&#xff0c;数据如果是高电平的话&#xff0c;发送过去也是高电平 1.轮询方式 CPU需要时刻注意发送…...

libdrm移植到arm设备

一、环境资源要求 下载libdrm Index of /libdrm 这边使用的是2.4.114版本&#xff0c;版本太高对meson版本要求也很高&#xff0c;为了省事用apt安装meson就不用太高版本了&#xff0c;1.x版本虽然使用makefile编译方便但是太老&#xff0c;对应用支持不太好。 https://dri…...

【PyTorch】解决Boolean value of Tensor with more than one value is ambiguous报错

理解并避免 PyTorch 中的 “Boolean value of Tensor with more than one value is ambiguous” 错误 在深度学习和数据科学领域&#xff0c;PyTorch 是一个强大的工具&#xff0c;它允许我们以直观和灵活的方式处理张量&#xff08;Tensor&#xff09;。然而&#xff0c;即使…...

CS 与 BS 架构的差异

在数字化的今天&#xff0c;选择软件架构模式对系统的性能、维护、安全和成本都有很大影响。BS架构和CS架构是最常见的两种模式&#xff0c;了解它们的区别和特点对开发人员和企业决策者都很重要。 CS架构最早出现&#xff0c;当时用户直接从主机获取数据。随着客户端和服务端…...

一款由 .NET 官方团队开源的电子商务系统 - eShop

项目介绍 eShop是一款由.NET官方开源的&#xff0c;基于.NET Aspire构建的用于参考学习的服务架构电子商务系统&#xff0c;旨在展示如何利用.NET框架及其相关技术栈构建一个现代化的电子商务网站。该项目采用服务架构&#xff0c;将应用程序分解为多个独立的服务&#xff0c;…...

项目顺利交付,几个关键阶段

年前离放假还有10天的时候&#xff0c;来了一个应急项目&#xff0c; 需要在放假前一天完成一个演示版本的项目&#xff0c;过年期间给甲方领导看。 本想的最后几天摸摸鱼&#xff0c;这么一来&#xff0c;非但摸鱼不了&#xff0c;还得加班。 还在虽然累&#xff0c;但也是…...

springboot简单应用

快速开发Springboot项目实现简单的增删改查&#xff0c;前期需要准备&#xff1a;idea与postman安装 Maven&#xff0c;MySQL&#xff08;8&#xff09;&#xff0c;JDK(21) 目录 前言 springboot 使用3.0版本&#xff0c;JDK使用21,MySQL使用8版本 开发环境IDEA使用2024版本 …...

lock 和 synchronized 区别

一、功能 Lock和Synchronized都是Java中用来解决线程安全问题的工具&#xff0c;它们能够确保多个线程在访问共享资源时的正确性和一致性。 二、特性 基本定义与实现&#xff1a; Synchronized是Java中的一个同步关键字&#xff0c;由JVM实现。Lock是Java中的一个接口&#x…...

inquirer介绍及配合lerna在Vue中使用示例

目录 安装基本用法使用多个提示框动态选择&#xff08;动态选项&#xff09;表单式输入配合lerna在Vue中使用示例 Inquirer 是一个用于创建交互式命令行工具的 Node.js 库&#xff0c;常用于收集用户输入。它提供了多种类型的提示框&#xff0c;可以用于创建交互式应用程序&…...

System类

作用&#xff1a;有标准输入、标准输出和错误输出流&#xff0c;对外部定义的属性和环境变量的访问&#xff0c;加载文件和库的方法&#xff0c;还有快速复制数组的一部分的实用方法 java.lang.Object继承者 java.lang.System字段摘要 主要常用的是方法 构造方法摘要 Syste…...

MySQL时间类型相关总结(DATETIME, TIMESTAMP, DATE, TIME, YEAR)

MySQL时间类型相关总结(DATETIME, TIMESTAMP, DATE, TIME, YEAR) MySQL官方文档&#xff1a; https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html 一. 对比&#xff1a; 在 MySQL 中&#xff0c;处理时间相关的数据类型主要有以下几种&#xff1a;DATE、TIME、…...

为什么会有函数调用参数带标签的写法?Swift函数调用的参数传递需要加前缀是否是冗余?函数调用?函数参数?

为什么会有函数调用参数带标签的写法? ObjC函数参数形式与众不同&#xff0c;实参前会加前缀&#xff0c;尤其参数很多的情况&#xff0c;可读性很强。例如&#xff1a; [person setAge: 29 setSex:1 setClass: 35]; 这种参数前面加前缀描述也被叫标签(Label). 注意&#xff0…...

Macos安装APOC拓展库

文章目录 说明错误提示原因分析解决方法 说明 Macos安装APOC核心库 错误提示 There is no procedure with the name apoc.generate.ba registered for this database instance. Please ensure youve spelled the procedure name correctly and that the procedure is prope…...

用NeuralProphet预测股价:AI金融新利器(附源码)

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a;我用NeuralProphet模型预测了股票价格&#xff0c;发现其通过结合时间序列分析和神经网络算法&#xff0c;确实能提供比传统Last Value方法更精准的预测。经过一系列超参数调优…...

go-zero学习笔记(三)

利用goctl生成rpc服务 编写proto文件 // 声明 proto 使用的语法版本 syntax "proto3";// proto 包名 package demoRpc;// golang 包名(可选) option go_package "./demo";// 如需为 .proto 文件添加注释&#xff0c;请使用 C/C 样式的 // 和 /* ... */…...

【ABB阀门定位器EDP300如何进行自整定】

ABB阀门定位器EDP300如何进行自整定 自整定前准备 检查安装与连接 确保阀门和定位器安装正确&#xff0c;机械连接牢固&#xff0c;无卡阻或松动。 确认气源压力符合要求&#xff08;通常为1.4~7 bar&#xff09;&#xff0c;气路无泄漏。 确保4~20mA输入信号稳定且接线正确。…...

Day48_20250130【回校继续打卡】_单调栈part1_739.每日温度|496.下一个更大元素I|503.下一个更大元素II

Day48_20250130_单调栈part1_739.每日温度|496.下一个更大元素I|503.下一个更大元素II 20250130补完 739.每日温度 题目 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0…...

使用 Let‘s Encrypt 和 OpenResty 实现域名转发与 SSL 配置

在搭建网站或服务时&#xff0c;确保域名的安全性和正确的流量转发是非常重要的。本文将介绍如何使用 Let’s Encrypt 获取免费的 SSL 证书&#xff0c;并将其配置到 OpenResty 中&#xff0c;同时实现特定的域名转发规则。这不仅可以提升网站的安全性&#xff0c;还能优化流量…...

Spring Boot启动内嵌tocmat原理

要研究Spring Boot启动内嵌tomcat的原理&#xff0c;就需要先了解一下Spring Boot自动配置的过程&#xff0c;首先简要的梳理一下springboot自动配置的步骤。 一、SpringBoot自动配置 当SpringBoot应用启动时&#xff0c;EnableAutoConfiguration注解被激活&#xff0c;该注解…...

【系统架构设计师】分布式数据库透明性

目录 1. 说明2. 分片透明3. 复制透明4. 位置透明5. 逻辑透明&#xff08;局部数据模型透明&#xff09;6.例题6.1 例题1 1. 说明 1.在分布式数据库系统中&#xff0c;分片透明、复制透明、位置透明和逻辑透明是几个重要的基本概念。2.分片透明、复制透明、位置透明和逻辑透明是…...

MySQL三大日志——binlog、redoLog、undoLog详解

日志是mysql数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息&#xff0c;能帮助我们进行很多容错及分析工作&#xff0c;其中有三大日志与我们这些开发者息息相关&#xff0c;本文将介绍binlog、redoLog、undoLog三种日志&#xff1a; 1. redoLog 1.1 为什么…...

ES6 对象扩展:对象简写,对象属性 表达式,扩展运算符 ...,Object.assign,Object.is,用法和应用场景

1. 对象属性简写 1.1 基本语法 // 传统写法 const name John; const age 25; const user {name: name,age: age };// ES6 简写语法 const user {name,age };1.2 实际应用场景 // 1. 函数返回对象 function createUser(name, age, email) {return {name,age,email}; }// …...

Markdown 博客写作图片自动上传到 CSDN 与博客园

背景 目前大部分的博客都是基于 Typora 软件编写&#xff0c;其中的图片都是本地相对路径&#xff0c;以前都手动逐个复制图片上传到 CSDN&#xff0c;但这个过程很繁琐&#xff0c;故想着使用自动上传图片。 目前有以下特点可利用&#xff1a; dotnet-cnblog 工具可自动把本…...

大模型—Dify本地化部署实战

Dify本地化部署实战 系统要求 安装 Dify 之前, 请确保你的机器已满足最低安装要求: CPU >= 2 CoreRAM >= 4 GiB本地部署 开始前先简单介绍下部署Dify需要用到的组件,稍微有点多,但放心,有Docker你怕啥? 关系数据库:postgres缓存:Redis向量数据库:支持weaviate…...

Java抽象类和接口的区别

一、抽象类 当一个类中没有包含足够的信息以描绘一个具体的对象时&#xff0c;这样的类就是抽象类&#xff1b;“抽象类”是用关键字 abstract 修饰的&#xff0c;抽象类中有一种特殊方法&#xff0c;即用abstract 关键字来修饰的方法&#xff0c;这些方法被称为“抽象方法” …...

基于YUV的色相调节(二)

文章目录 量纲范围归一化归一化因子&#xff1a; U m , V m U_m, V_m Um​,Vm​归一化因子&#xff1a; U m a x , V m a x U_{max}, V_{max} Umax​,Vmax​ 接上一篇&#xff1a;基于YUV的色相调节&#xff08;一&#xff09; 量纲范围归一化 正常情况下UV的量纲范围不一样&…...

【QT笔记】使用QScrollArea实现多行文本样式显示

目录 一、QScrollArea 的基本概念 二、demo代码 三、实现效果 1、页面空间足够&#xff0c;无滚动条时显示效果 2、有滚动条时显示效果 一、QScrollArea 的基本概念 QScrollArea 是 Qt 框架中用于提供一个滚动条区域&#xff0c;允许用户滚动查看比当前可视区域更大的内容…...

【自然语言处理】TextRank 算法提取关键词(Python实现)

文章目录 前言PageRank 实现TextRank 简单版源码实现jieba工具包实现TextRank 前言 TextRank 算法是一种基于图的排序算法&#xff0c;主要用于文本处理中的关键词提取和文本摘要。它基于图中节点之间的关系来评估节点的重要性&#xff0c;类似于 Google 的 PageRank 算法。Tex…...

八大排序算法细讲

目录 排序 概念 运用 常见排序算法 插入排序 直接插入排序 思想&#xff1a; 步骤&#xff08;排升序&#xff09;: 代码部分&#xff1a; 时间复杂度&#xff1a; 希尔排序 思路 步骤 gap的取法 代码部分&#xff1a; 时间复杂度&#xff1a; 选择排序 直接选…...

机器学习9-卷积和卷积核2

机器学习9-卷积和卷积核2 卷积与边缘提取边缘的种类边缘检测图像求导解析示例 图像求导公式&#xff1a;解析总结 图像梯度噪声的影响 边缘检测目标非极大值抑制总结 卷积与边缘提取 边缘&#xff1a;图像中亮度明显而急剧变化的点 为什么要研究边缘&#xff1f; 编码图像中…...

微服务知识——微服务拆分规范

文章目录 一、微服务拆分规范1、高内聚、低耦合2、服务拆分正交性原则3、服务拆分层级最多三层4、服务粒度适中、演进式拆分5、避免环形依赖、双向依赖6、通用化接口设计&#xff0c;减少定制化设计7、接口设计需要严格保证兼容性8、将串行调用改为并行调用&#xff0c;或者异步…...

【回溯+剪枝】单词搜索,你能用递归解决吗?

文章目录 79. 单词搜索解题思路&#xff1a;回溯&#xff08;深搜&#xff09; 剪枝 79. 单词搜索 79. 单词搜索 ​ 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 …...

deepseek接入pycharm 进行AI编程

要将DeepSeek接入PyCharm进行AI编程,可以按照以下步骤操作: ### 1. 获取DeepSeek API访问权限 DeepSeek通常以API的形式对外提供服务,你需要在其官方网站注册账号,申请API访问权限。在申请通过后,会获得API密钥(API Key),这是后续调用API的关键凭证。 ### 2. 安装必要…...

M系列/Mac安装配置Node.js全栈开发环境(nvm+npm+yarn)

一、安装 nvm&#xff08;Node Version Manager&#xff09; 打开终端&#xff0c;使用 curl 在 M 系列 Mac 上安装 nvm&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash对于非 M 系列的 Intel Mac&#xff0c;上述命令同样适…...

常见Linux命令的复习

常见命令 ls 列出工作目录 ls -l&#xff1a;以长格式显示目录下的文件和子目录信息。ls -a&#xff1a;显示所有文件和子目录&#xff0c;包括隐藏文件 ll 列出该目录下的详细信息 看到该目录下的所有目录和文件的详细信息 cd 切换当前工作目录里 cd /path/to/directory&…...

朴素贝叶斯算法相关文献

朴素贝叶斯是一种基于概率的简单但强大的分类算法。尽管其“朴素”假设&#xff08;特征之间相互独立&#xff09;在现实中往往不成立&#xff0c;但在许多实际应用中&#xff0c;它依然表现出色&#xff0c;尤其是在文本分类、垃圾邮件过滤和情感分析等领域。近年来&#xff0…...

【鸿蒙HarmonyOS Next实战开发】多媒体视频播放-ijkplayer

简介 ijkplayer是OpenHarmony和HarmonyOS环境下可用的一款基于FFmpeg的视频播放器。 演示 下载安装 ohpm install ohos/ijkplayer使用说明 import { IjkMediaPlayer } from "ohos/ijkplayer";import type { OnPreparedListener } from "ohos/ijkplayer";i…...

jvm - GC篇

如何减慢一个对象进入老年代的速度&#xff0c;如何降低GC的次数 堆内存细分 年轻代&#xff08;Young Generation&#xff09;&#xff1a; 新创建的对象首先被分配在年轻代中。年轻代又被进一步划分为一个Eden区和两个Survivor区&#xff08;通常称为S0和S1&#xff09;。…...

edu小程序挖掘严重支付逻辑漏洞

edu小程序挖掘严重支付逻辑漏洞 一、敏感信息泄露 打开购电小程序 这里需要输入姓名和学号&#xff0c;直接搜索引擎搜索即可得到&#xff0c;这就不用多说了&#xff0c;但是这里的手机号可以任意输入&#xff0c;只要用户没有绑定手机号这里我们输入自己的手机号抓包直接进…...

职责链模式

介绍 避免将请求发送者和接收者耦合在一起&#xff0c;让多个对象都有机会接收请求&#xff0c;将这些对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有对象处理它为止。 处理请求的对象组成一条链&#xff08;职责链&#xff09;&#xff0c;职责链可…...

数据分析:企业数字化转型的金钥匙

引言&#xff1a;数字化浪潮下的数据金矿 在数字化浪潮席卷全球的背景下&#xff0c;有研究表明&#xff0c;只有不到30%的企业能够充分利用手中掌握的数据&#xff0c;这是否让人深思&#xff1f;数据已然成为企业最为宝贵的资产之一。然而&#xff0c;企业是否真正准备好从数…...

将Windows下的USB设备共享给WSL(ubuntu)

前言 本文用于学习记录&#xff0c;文中提到的方法也来自于网上资料&#xff0c;如有不对请指出&#xff0c;谢谢&#xff01; 微软官方参考链接&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl/connect-usb 如果没有特殊标注&#xff0c;以下命令均在Windows终…...

UG NX二次开发(Python)-API函数介绍与应用实例(三)-UFLayer类操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1 前言2、UFLayer类说明3、获取当前工作图层4、移动对象到特定的图层1 前言 采用Python语言进行UG NX二次开发的帮助材料很少,采用录制的方法是一种比较容易实现的方式,但是使用UFun函数更容易上…...

【PostgreSQL内核学习 —— (WindowAgg(三))】

WindowAgg set_subquery_pathlist 部分函数解读check_and_push_window_quals 函数find_window_run_conditions 函数执行案例总结 计划器模块&#xff08;set_plan_refs函数&#xff09;set_windowagg_runcondition_references 函数执行案例 fix_windowagg_condition_expr 函数f…...