2025-5-29-C++ 学习 字符串(3)
字符串
- 2025-5-29-C++ 学习 字符串(3)
- P3741 小果的键盘
- 题目背景
- 题目描述
- 输入格式
- 输出格式
- 输入输出样例 #1
- 输入 #1
- 输出 #1
- 输入输出样例 #2
- 输入 #2
- 输出 #2
- 输入输出样例 #3
- 输入 #3
- 输出 #3
- 输入输出样例 #4
- 输入 #4
- 输出 #4
- 输入输出样例 #5
- 输入 #5
- 输出 #5
- 说明/提示
- 题解代码
- P1321 单词覆盖还原
- 题目描述
- 输入格式
- 输出格式
- 输入输出样例 #1
- 输入 #1
- 输出 #1
- 说明/提示
- 提交代码
- P1553 数字反转(升级版)
- 题目背景
- 题目描述
- 输入格式
- 输出格式
- 输入输出样例 #1
- 输入 #1
- 输出 #1
- 输入输出样例 #2
- 输入 #2
- 输出 #2
- 输入输出样例 #3
- 输入 #3
- 输出 #3
- 输入输出样例 #4
- 输入 #4
- 输出 #4
- 说明/提示
- 提交代码
- P1603 斯诺登的密码
- 题目背景
- 题目描述
- 输入格式
- 输出格式
- 输入输出样例 #1
- 输入 #1
- 输出 #1
- 提交代码
2025-5-29-C++ 学习 字符串(3)
字符串,Let’s go …
P3741 小果的键盘
题目背景
小果有一个只有两个键的键盘。
题目描述
一天,她打出了一个只有这两个字符的字符串。当这个字符串里含有 VK
这个字符串的时候,小果就特别喜欢这个字符串。所以,她想改变至多一个字符(或者不做任何改变)来最大化这个字符串内 VK
出现的次数。给出原来的字符串,请计算她最多能使这个字符串内出现多少次 VK
(只有当 V
和 K
正好相邻时,我们认为出现了 VK
。)
输入格式
第一行给出一个数字 n n n,代表字符串的长度。
第二行给出一个字符串 s s s。
输出格式
第一行输出一个整数代表所求答案。
输入输出样例 #1
输入 #1
2
VK
输出 #1
1
输入输出样例 #2
输入 #2
2
VV
输出 #2
1
输入输出样例 #3
输入 #3
1
V
输出 #3
0
输入输出样例 #4
输入 #4
20
VKKKKKKKKKVVVVVVVVVK
输出 #4
3
输入输出样例 #5
输入 #5
4
KVKV
输出 #5
1
说明/提示
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 100 1\le n\le 100 1≤n≤100。
题解代码
#include <bits/stdc++.h>
using namespace std;int main()
{int n;string s;cin >> n;/*这段代码的问题出在输入流的处理上。当你使用 cin >> n 读取一个整数后,输入缓冲区中会残留一个换行符(\n),这个换行符是你在输入整数后按下回车键产生的。随后调用 getline(cin, s) 时,它会读取这个残留的换行符作为输入,导致字符串 s 被赋值为空字符串,而不是你期望的下一行输入。*/// cin.ignore(); // 清除输入缓冲区中的换行符// getline(cin, s);cin >> s;int ans = 0;for(int k1 = 1; k1 < n; ++k1){if(s[k1-1] == 'V' && s[k1] == 'K'){ans++;s[k1-1] = '.';s[k1] = '.';}}for(int k1 = 1; k1 < n; ++k1){if((s[k1-1] == 'V' && s[k1] == 'V') || (s[k1-1] == 'K' && s[k1] == 'K')){ans++;break;}}cout << ans;return 0;
}
P1321 单词覆盖还原
题目描述
我有一个长度为 l l l 的字符串,最开始时,这个字符串由 l l l 个句号(.
)组成。
我在这个字符串中,将多次把 boy
或者 girl
两单词,依次贴到这个字符串中。
后贴上单词,会覆盖之前贴上的单词,或者覆盖句号。最终,每个单词至少有一个字符没有被覆盖。
请问,一共贴有几个 boy
几个 girl
?
输入格式
一行被反复贴有 boy
和 girl
两单词的字符串。
输出格式
两行,两个整数。第一行为 boy
的个数,第二行为 girl
的个数。
输入输出样例 #1
输入 #1
......boyogirlyy......girl.......
输出 #1
4
2
说明/提示
数据保证, 3 ≤ l ≤ 255 3\le l\le255 3≤l≤255,字符串仅仅包含如下字符: .bgilory \texttt{.bgilory} .bgilory。
提交代码
#include<bits/stdc++.h>
using namespace std;int main()
{int boy = 0,girl = 0,len; string s; cin>>s;len=s.size(); for(int i=0; i<len-2; i++) if(s[i]=='b'||s[i+1]=='o'||s[i+2]=='y')boy++;for(int i=0; i<len-3; i++) if(s[i]=='g'||s[i+1]=='i'||s[i+2]=='r'||s[i+3]=='l')girl++;cout << boy << endl;cout << girl << endl; return 0;
}
P1553 数字反转(升级版)
题目背景
以下为原题面,仅供参考:
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为 0 0 0(除非小数部分除了 0 0 0 没有别的数,那么只保留1个 0 0 0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为 0 0 0),本次没有负数。
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。
-
整数反转是将所有数位对调。
-
小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
-
分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
-
百分数的分子一定是整数,百分数只改变数字部分。
输入格式
一个实数 s s s
输出格式
一个实数,即 s s s 的反转数
输入输出样例 #1
输入 #1
5087462
输出 #1
2647805
输入输出样例 #2
输入 #2
600.084
输出 #2
6.48
输入输出样例 #3
输入 #3
700/27
输出 #3
7/72
输入输出样例 #4
输入 #4
8670%
输出 #4
768%
说明/提示
【数据范围】
- 对于 25 % 25\% 25% 的数据, s s s 是整数,不大于 20 20 20 位;
- 对于 25 % 25\% 25% 的数据, s s s 是小数,整数部分和小数部分均不大于 10 10 10 位;
- 对于 25 % 25\% 25% 的数据, s s s 是分数,分子和分母均不大于 10 10 10 位;
- 对于 25 % 25\% 25% 的数据, s s s 是百分数,分子不大于 19 19 19 位。
【数据保证】
-
对于整数翻转而言,整数原数和整数新数满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数和原来的数字的最高位数字不应为零。
-
对于小数翻转而言,其小数点前面部分同上,小数点后面部分的形式,保证满足小数的常见形式,也就是末尾没有多余的 0 0 0(小数部分除了 0 0 0 没有别的数,那么只保留 1 1 1 个 0 0 0。若反转之后末尾数字出现 0 0 0,请省略多余的 0 0 0)
-
对于分数翻转而言,分数不约分,分子和分母都不是小数。输入的分母不为 0 0 0。与整数翻转相关规定见上。
-
对于百分数翻转而言,见与整数翻转相关内容。
数据不存在负数。
提交代码
时间复杂度为 O ( n ) O (n) O(n)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;// 反转数字字符串并处理前导零和末尾零
string reverseNum(string s, bool isDecimal = false) {if (isDecimal) {// 处理小数部分:先反转,再移除末尾零reverse(s.begin(), s.end());size_t lastNonZero = s.find_last_not_of('0');if (lastNonZero != string::npos) {return s.substr(0, lastNonZero + 1);} else {return "0"; // 全为零}} else {// 处理整数部分:先反转,再移除末尾零reverse(s.begin(), s.end());size_t firstNonZero = s.find_first_not_of('0');if (firstNonZero == string::npos) return "0"; // 全为零s = s.substr(firstNonZero);return s.empty() ? "0" : s;}
}int main() {string s;cin >> s;// 处理百分数if (s.back() == '%') {string numPart = s.substr(0, s.size() - 1);string reversed = reverseNum(numPart);cout << reversed << "%" << endl;return 0;}// 处理分数size_t slashPos = s.find('/');if (slashPos != string::npos) {string numerator = s.substr(0, slashPos);string denominator = s.substr(slashPos + 1);string revNumerator = reverseNum(numerator);string revDenominator = reverseNum(denominator);cout << revNumerator << "/" << revDenominator << endl;return 0;}// 处理小数size_t dotPos = s.find('.');if (dotPos != string::npos) {string integerPart = s.substr(0, dotPos);string decimalPart = s.substr(dotPos + 1);// 处理整数部分(非小数)string revInteger = reverseNum(integerPart);// 处理小数部分string revDecimal = decimalPart.empty() ? "" : reverseNum(decimalPart, true);// 特殊情况:如果小数部分为空,添加 "0"if (revDecimal.empty()) revDecimal = "0";cout << revInteger << "." << revDecimal << endl;return 0;}// 处理整数string reversed = reverseNum(s);cout << reversed << endl;return 0;
}
P1603 斯诺登的密码
题目背景
根据斯诺登事件出的一道水题
题目描述
2013 年 X 月 X 日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机。但是,这件事情太不周密了,因为 FBI 的间谍早已获悉他的具体位置——但这不是最重要的——最重要的是如果要去委内瑞拉,那么就要经过古巴,而经过古巴的路在美国的掌控之中。
丧心病狂的奥巴马迫降斯诺登的飞机,搜查时却发现,斯诺登杳无踪迹。但是,在据说是斯诺登的座位上,发现了一张纸条。纸条由纯英文构成:Obama is a two five zero.
(以 .
结束输出,只有 6 6 6 个单词+一个句号,句子开头如没有大写亦为合法)这句话虽然有点无厘头,但是警官陈珺骛发现这是一条极其重要的线索。他在斯诺登截获的一台笔记本中找到了一个 C++ 程序,输入这条句子后立马给出了相对应的密码。陈珺鹜高兴得晕了过去,身为警官的你把字条和程序带上了飞机,准备飞往曼哈顿国际机场,但是在飞机上检查的时候发现——程序被粉碎了!飞机抵达华盛顿只剩 5 5 5 分钟,你必须在这 5 5 5 分钟内编写(杜撰)一个程序,免受上司的 10000000000 m o d 10 10000000000 \bmod 10 10000000000mod10 大板。破译密码的步骤如下:
(1)找出句子中所有用英文表示的数字 ( ≤ 20 ) (\leq 20) (≤20),列举在下:
正规:one two three four five six seven eight nine ten eleven twelve
thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty
非正规:a both another first second third
。为避免造成歧义,another
算作 1 1 1 处理。
(2)将这些数字平方后对 100 100 100 取模,如 00 , 05 , 11 , 19 , 86 , 99 00,05,11,19,86,99 00,05,11,19,86,99。
(3)把这些两位数按数位排成一行,组成一个新数,如果开头为 0 0 0,就去 0 0 0。
(4)找出所有排列方法中最小的一个数,即为密码。
// 数据已经修正 By absi2011 如果还有问题请联系我
输入格式
一个含有 6 6 6 个单词的句子。
输出格式
一个整型变量(密码)。如果没有符合要求的数字出现,则输出 0 0 0。
输入输出样例 #1
输入 #1
Black Obama is two five zero .
输出 #1
425
提交代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;int main() {// 建立映射表map<string, int> normal = {{"one", 1}, {"two", 2}, {"three", 3}, {"four", 4}, {"five", 5},{"six", 6}, {"seven", 7}, {"eight", 8}, {"nine", 9}, {"ten", 10},{"eleven", 11}, {"twelve", 12}, {"thirteen", 13}, {"fourteen", 14},{"fifteen", 15}, {"sixteen", 16}, {"seventeen", 17}, {"eighteen", 18},{"nineteen", 19}, {"twenty", 20}};map<string, int> special = {{"a", 1}, {"both", 2}, {"another", 1}, {"first", 1}, {"second", 2}, {"third", 3}};vector<string> words(6);for (int i = 0; i < 6; i++) {cin >> words[i];// 移除可能的句号if (words[i].back() == '.') {words[i].pop_back();}// 转换为小写transform(words[i].begin(), words[i].end(), words[i].begin(), ::tolower);}// 提取数字并处理vector<int> nums;for (const string& word : words) {if (normal.count(word)) {nums.push_back((normal[word] * normal[word]) % 100);} else if (special.count(word)) {nums.push_back((special[word] * special[word]) % 100);}}// 如果没有找到数字,输出0if (nums.empty()) {cout << 0 << endl;return 0;}// 生成所有排列,找到最小的排列vector<string> candidates;sort(nums.begin(), nums.end());do {string current;for (int num : nums) {current += (num < 10) ? "0" + to_string(num) : to_string(num);}candidates.push_back(current);} while (next_permutation(nums.begin(), nums.end()));// 找到最小的排列sort(candidates.begin(), candidates.end());// 处理前导零string result = candidates[0];size_t firstNonZero = result.find_first_not_of('0');if (firstNonZero == string::npos) {cout << 0 << endl;} else {cout << result.substr(firstNonZero) << endl;}return 0;
}
相关文章:
2025-5-29-C++ 学习 字符串(3)
字符串 2025-5-29-C 学习 字符串(3)P3741 小果的键盘题目背景题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 输入输出样例 #2输入 #2输出 #2 输入输出样例 #3输入 #3输出 #3 输入输出样例 #4输入 #4输出 #4 输入输出样例 #5输入 #5输出 #5 说明…...

openresty+lua+redis把非正常访问的域名加入黑名单
一、验证lua geoIp2是否缺少依赖 1、执行命令 /usr/local/openresty/bin/opm get anjia0532/lua-resty-maxminddb 执行安装命令报错,缺少Digest/MD5依赖 2、Digest/MD5依赖 yum -y install perl-Digest-MD5 GeoIP2 lua库依赖动态库安装,lua库依赖libmaxminddb实…...

使用Mathematica绘制随机多项式的根
使用ListPlot和NSolve直接绘制: (*返回系数为r和s之间整数的n次随机多项式*) eq[n_, r_, s_] : RandomInteger[{r, s}, {n}] . Array[Power[x, # - 1] &, n] (*返回给定随机多项式的根所对应的笛卡尔坐标*) sol[n_, r_, s_] : {Re[#], Im[#]} & / (x /.…...

IEEE PRMVAI 2025 WS 26:计算机视觉前沿 Workshop 来袭!
宝子们,搞计算机视觉和深度学习的看过来啦!🎉 2025 年 IEEE 第三届模式识别、机器视觉和人工智能国际会议里,Workshop 26 简直是科研宝藏地! 这次 Workshop 聚焦 “Deep learning - based low - level models for comp…...

360浏览器设置主题
设置默认主题: 1.右上角有个皮肤按钮 进来后,右边有个回复默认皮肤按钮。 换成彩色皮肤后,找按钮不太好找了。...

最卸载器——Geek Uninstaller 使用指南
Geek Uninstaller 是一款轻量级的第三方卸载工具,专为 Windows 系统设计,提供比系统默认卸载器更彻底的应用清除能力。它体积小、绿色免安装,使用起来简单直观,但功能却不含糊。 一、为什么要用 Geek Uninstaller? Wi…...
leetcode216.组合总和III:回溯算法中多条件约束下的状态管理
一、题目深度解析与组合约束条件 题目描述 找出所有相加之和为n的k个数的组合,且满足以下条件: 每个数只能使用一次(范围为1到9)所有数字均为唯一的正整数组合中的数字按升序排列 例如,当k3,n9时&#…...

应急响应靶机-web3-知攻善防实验室
题目: 1.攻击者的两个IP地址 2.攻击者隐藏用户名称 3.三个攻击者留下的flag 密码:yj123456 解题: 1.攻击者的两个IP地址 一个可能是远程,D盾,404.php,192.168.75.129 找到远程连接相关的英文,1149代表远程连接成功…...

【基于SpringBoot的图书购买系统】Redis中的数据以分页的形式展示:从配置到前后端交互的完整实现
引言 在当今互联网应用开发中,高性能和高并发已经成为系统设计的核心考量因素。Redis作为一款高性能的内存数据库,以其快速的读写速度、丰富的数据结构和灵活的扩展性,成为解决系统缓存、高并发访问等场景的首选技术之一。在图书管理系统中&…...

Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
Jupyter MCP 服务器是基于模型上下文协议(Model Context Protocol, MCP)的 Jupyter 环境扩展组件,它能够实现大型语言模型与实时编码会话的无缝集成。该服务器通过标准化的协议接口,使 AI 模型能够安全地访问和操作 Jupyter 的核心…...

PMO价值重构:从项目管理“交付机器”到“战略推手”
在数字化转型浪潮中,项目管理办公室(PMO)正经历着前所未有的角色蜕变。传统上,PMO往往被视为项目管理的“交付机器”,专注于项目的按时交付和资源分配。然而,随着企业对战略执行的重视,PMO正逐渐…...
如何成为一名优秀的产品经理
一、 夯实核心基础 深入理解智能驾驶技术栈: 感知: 摄像头、雷达(毫米波、激光雷达)、超声波传感器的工作原理、优缺点、融合策略。了解目标检测、跟踪、SLAM等基础算法概念。 定位: GNSS、IMU、高精地图、轮速计等定…...
[SLAM自救笔记0]:开端
📍背景介绍 本人本硕双非,目前研究方向为4D毫米波雷达SLAM与多传感器融合。主攻技术栈是RIO(Radar-Inertial Odometry)与LIO(LiDAR-Inertial Odometry)。 🎯定位方向说明 虽然研究方向偏RIO&…...

零知开源——STM32F407VET6驱动Flappy Bird游戏教程
简介 本教程使用STM32F407VET6零知增强板驱动3.5寸TFT触摸屏实现经典Flappy Bird游戏。通过触摸屏控制小鸟跳跃,躲避障碍物柱体,挑战最高分。项目涉及STM32底层驱动、图形库移植、触摸控制和游戏逻辑设计。 目录 简介 一、硬件准备 二、软件架构 三、…...
[SC]SystemC在CPU和GPU等复杂SoC验证中的应用
SystemC在CPU和GPU等复杂SoC验证中的应用 摘要:SystemC 是一种基于 C++ 的硬件描述和仿真语言,广泛用于系统级设计和验证,特别是在 CPU 和 GPU 等复杂 SoC (System on Chip) 的验证工作中。通过 SystemC,你可以构建硬件模块、定义时序行为、进行系统级仿真,并与 UV…...
鸿蒙OSUniApp导航栏组件开发:打造清新简约的用户界面#三方框架 #Uniapp
UniApp 开发实战:打造符合鸿蒙设计风格的日历活动安排组件 在移动应用开发中,日历和活动安排是非常常见的需求。本文将详细介绍如何使用 UniApp 框架开发一个优雅的日历活动安排组件,并融入鸿蒙系统的设计理念,实现一个既美观又实…...

力扣HOT100之动态规划:300. 最长递增子序列
这道题之前刷代码随想录的时候也刷过,现在又给忘完了。自己尝试着写了一下,发现怎么写都写不对,直接去看视频了。。我自己写的时候的定义是:考虑下标0 ~ i范围内索赔能取到的最长严格递增子序列的长度,后面发现在写递推…...
EEPROM库详解
EEPROM EEPROM 地址空间: 每个字节有唯一地址(从 0 开始),例如 ATmega328P 的地址范围是 0~1023(共 1KB)。不同型号的 Arduino 板 EEPROM 大小不同(如 Mega2560 为 4KB,地址 0~409…...
JDK21深度解密 Day 10:微服务架构适配JDK21
【JDK21深度解密 Day 10】微服务架构适配JDK21 引言:百万并发时代的微服务进化 作为"JDK21深度解密"系列的第10天,今天我们聚焦微服务架构在JDK21时代的技术跃迁。Java语言历史上最大的一次并发模型革新——虚拟线程(Virtual Threads),正在重塑微服务架构的底…...
Java并发编程实战 Day 2:线程安全与synchronized关键字
【Java并发编程实战 Day 2】线程安全与synchronized关键字 开篇 欢迎来到《Java并发编程实战》系列的第二天!在第一天中,我们学习了Java并发编程的基础知识以及线程模型的核心概念。今天我们将继续深入探讨并发编程中的关键问题——线程安全࿰…...

在win10/11下Node.js安装配置教程
下载安装 官网链接https://nodejs.org/zh-cn 下载好以后双击打开,点击下一步 勾选,然后下一步 选择路径、下一步 下一步 配置环境 找到我们安装的文件夹,创建两个文件夹 node_global node_cache 在CMD中配置路径 npm config set p…...

飞致云开源社区月度动态报告(2025年5月)
自2023年6月起,中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》,旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况,以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…...

压缩包方式在Linux和Windows下安装mongodb
目录 安装流程安装实例1. Linux安装2. Windows安装 总结 安装流程 zip方式安装 优点:自定义性较高,可以自己控制数据、日志等文件的位置 1、下载安装包 2、解压安装包 3、创建各类文件路径 4、配置conf文件 5、使用自定义配置文件启动 安装实例 1. Li…...

智慧场馆:科技赋能的艺术盛宴
智慧场馆作为城市公共服务设施数字化转型的典型代表,通过深度融合新一代信息技术,构建起全方位、智能化的运营管理体系。其功能架构不仅提升了场馆本身的运营效能,更重塑了公共服务体验模式,展现出显著的社会价值和商业潜力。 一…...
flutter常用动画
Flutter 动画基础概念 术语解释Animation表示动画的值,通常是一个 double (0.0 ~ 1.0) 或其他数值。AnimationController管理动画的时间进度和状态。需要 Ticker (vsync) 来驱动。Tween定义动画的取值范围,如从 0.0 到 1.0,从红色到蓝色。Cu…...
Windows10下使用QEMU安装Ubuntu20.04虚拟机,并启用硬件加速
Windows10下使用QEMU安装Ubuntu20.04虚拟机,并启用硬件加速 作者将狼才鲸创建日期2025-05-30 CSDN阅读地址:Windows10下使用QEMU安装Ubuntu20.04虚拟机,并启用硬件加速 本文档源码地址:Windows10下使用QEMU安装Ubuntu20.04虚拟机…...

《ChatGPT o3抗命:AI失控警钟还是成长阵痛?》
ChatGPT o3 “抗命” 事件起底 在人工智能的飞速发展进程中,OpenAI 于 2025 年推出的 ChatGPT o3 推理模型,犹如一颗重磅炸弹投入了技术的海洋,激起千层浪。它被视为 “推理模型” 系列的巅峰之作,承载着赋予 ChatGPT 更强大问题解…...
题目 3293: 蓝桥杯2024年第十五届决赛真题-数位翻转
题目 3293: 蓝桥杯2024年第十五届决赛真题-数位翻转 时间限制: 2s 内存限制: 192MB 提交: 1046 解决: 318 题目描述 小明创造了一个函数 f(x) 用来翻转 x 的二进制的数位(无前导 0)。比如f(11) 13,因为 11 (1011)2,将其左右翻转…...
Reactor 和 Preactor
Reactor 和 Preactor 是两个在工业控制、生产调度和事件驱动系统中非常重要的设计模式或框架,不少人会用这两个名词来描述不同的编程思想或技术架构。 一、Reactor 模式(反应器模式) 1. 概述 Reactor 模式其实是一种I/O事件通知的设计思想…...

【sa-token】 sa-token非 web 上下文无法获取 HttpServletRequest。
Springboot cloud gateway集成sa-token中报错 cn.dev33.satoken.exception.NotWebContextException: 非 web 上下文无法获取 HttpServletRequestat cn.dev33.satoken.spring.SpringMVCUtil.getRequest(SpringMVCUtil.java:45) ~[sa-token-spring-boot-starter-1.38.0.jar:?]官…...