STL —— 洛谷字符串(string库)入门题(蓝桥杯题目训练)(一)
目录
一、B2109 统计数字字符个数 - 洛谷
算法代码:
1. 引入库和命名空间
2. 主函数
3. 读取输入
4. 变量初始化
5. 遍历字符串
6. 输出结果
7. 返回值
总结
评测记录:
二、B2110 找第一个只出现一次的字符 - 洛谷
方法一:算法代码(使用哈希表)
1. 引入库和命名空间
2. 定义首个唯一字符的函数
3. 处理空字符串
4. 统计字符出现次数
5. 找到第一个只出现一次的字符
6. 如果没有找到唯一字符
7. 主函数
总结
方法二:算法代码(使用数组实现哈希表)
1. 引入库和命名空间
2. 定义首个唯一字符的函数
3. 处理空字符串
4. 初始化字符计数数组
5. 统计字符出现次数
6. 找到第一个只出现一次的字符
7. 如果没有找到唯一字符
8. 主函数
总结
评测记录:
三、B2112 石头剪子布 - 洛谷
算法代码:
1. 引入库
2. 主函数
3. 读取输入
4. 循环处理每局游戏
5. 读取玩家的出手
6. 判断胜负
7. 判断玩家1的胜负情况
8. 返回值
总结
评测记录:
四、B2113 输出亲朋字符串 - 洛谷
算法代码:
1. 引入库和命名空间
2. 定义生成 Friend String 的函数
3. 初始化变量
4. 遍历字符串
5. 生成新字符
6. 添加新字符到结果字符串
7. 返回结果
8. 主函数
注意
代码改进建议
总结
评测记录:
五、B2114 配对碱基链 - 洛谷
方法一:算法代码(使用map一一对应)
1. 引入库
2. 定义全局变量
3. 主函数
4. 读取输入
5. 定义碱基配对关系
6. 输出互补序列
7. 返回值
总结
方法二:算法代码(直接替换)
1. 引入库
2. 定义字符数组
3. 主函数
4. 读取输入
5. 遍历字符串并转换碱基
6. 返回值
总结
改进建议
测评记录:
六、 B2116 加密的病历单 - 洛谷
算法代码:
1. 引入库
2. 定义解密函数
3. 初始化结果字符串
4. 步骤 1:大小写反转
5. 步骤 2:逆序存储
6. 步骤 3:字符循环右移三个位置
为什么使用模运算(% 26)
7. 返回结果
8. 主函数
总结
评测记录:
七、B2117 整理药名 - 洛谷
算法代码:
1. 引入必要的库
2. 定义主函数
3. 读取字符串数量
4. 循环处理每个字符串
5. 格式化首字母为大写
6. 格式化其他字符为小写
7. 输出格式化后的字符串
8. 结束主函数
完整代码示例
总结
评测记录:
八、B2118 验证子串 - 洛谷
算法代码:
1、代码思路:
2、代码解释:
3、代码优化建议:
4、优化后的代码:
5、优化点解释:
评测记录
九、B2119 删除单词后缀 - 洛谷
算法代码:
1、代码思路:
2、具体实现步骤:
评测记录:编辑
十、 B2120 单词的长度 - 洛谷
算法代码:
引入库
定义主函数
声明变量
循环读取输入
处理第一次输入
处理后续输入
结束主函数
总结
评测记录:
一、B2109 统计数字字符个数 - 洛谷
算法代码:
#include<iostream>
#include<string>
using namespace std;int main()
{string s;getline(cin,s);int num=0;int n=s.size();for(int i=0;i<n;i++){if(s[i]>='0'&&s[i]<='9'){num++;}else{continue;}}cout<<num<<endl;
}
1. 引入库和命名空间
#include<iostream>
#include<string>
using namespace std;
-
#include <iostream>
: 引入输入输出流库,用于处理输入和输出。 -
#include <string>
: 引入字符串库,提供字符串处理功能。 -
using namespace std;
: 允许直接使用std
命名空间中的元素。
2. 主函数
int main() {
-
主程序的入口。
3. 读取输入
string s;
getline(cin, s);
-
创建一个字符串
s
。 -
使用
getline(cin, s)
从标准输入读取一整行,直到遇到换行符为止。
4. 变量初始化
int num = 0;
int n = s.size();
-
int num = 0;
: 初始化计数器num
为 0,用于统计数字字符的个数。 -
int n = s.size();
: 获取字符串s
的长度,用于后续的循环条件。
5. 遍历字符串
for(int i = 0; i < n; i++) {if(s[i] >= '0' && s[i] <= '9') {num++;} else {continue;}
}
-
使用
for
循环遍历字符串中的每个字符。 -
判断条件:
-
如果当前字符
s[i]
是数字(在'0'
到'9'
之间),则num
增加 1。 -
如果当前字符不是数字,
continue
语句将使循环继续到下一个字符,实际上这里的continue
是可以省略的,因为后面没有其他代码了。
-
6. 输出结果
cout << num << endl;
-
输出计数器
num
,即字符串中数字字符的总数。
7. 返回值
return 0;
-
返回 0,表示程序正常退出。
总结
这段代码有效地统计了输入字符串中数字字符的个数,时间复杂度为 O(n),其中 n 是字符串的长度,因为每个字符都被访问了一次。代码简单直接,适合用来进行字符统计的基本操作。
评测记录:
二、B2110 找第一个只出现一次的字符 - 洛谷
方法一:算法代码(使用哈希表)
#include <iostream>
#include <unordered_map>
using namespace std;string firstUniqueChar(const string& s) {if (s.empty()) {return "no"; // 处理空字符串}unordered_map<char, int> charCount;// 统计每个字符的出现次数for (char ch : s) {if (ch >= 'a' && ch <= 'z') { // 确保只处理小写字母charCount[ch]++;}}// 找到第一个只出现一次的字符for (char ch : s) {if (charCount[ch] == 1) {return string(1, ch); // 返回字符的字符串形式}}// 如果没有找到,返回 "no"return "no";
}int main() {string s;cin >> s;string result = firstUniqueChar(s);cout << result << endl;return 0;
}
1. 引入库和命名空间
#include <iostream>
#include <unordered_map>
using namespace std;
-
#include <iostream>
: 引入输入输出流库,用于处理输入和输出。 -
#include <unordered_map>
: 引入哈希表(无序映射)库,以便使用unordered_map
来存储字符及其出现次数。 -
using namespace std;
: 允许直接使用std
命名空间中的元素,避免在使用标准库函数时加上std::
前缀。
2. 定义首个唯一字符的函数
string firstUniqueChar(const string& s) {
-
firstUniqueChar
函数接受一个常量字符串引用s
,返回一个字符串。
3. 处理空字符串
if (s.empty()) {return "no"; // 处理空字符串
}
-
检查字符串是否为空。如果为空,则直接返回
"no"
。
4. 统计字符出现次数
unordered_map<char, int> charCount;// 统计每个字符的出现次数
for (char ch : s) {if (ch >= 'a' && ch <= 'z') { // 确保只处理小写字母charCount[ch]++;}
}
-
使用
unordered_map<char, int>
变量charCount
来存储每个字符及其出现的次数。 -
遍历字符串
s
,对于每个字符ch
:-
仅当字符是小写字母(’a’ 到 'z’)时,才对其进行统计,使用
charCount[ch]++
进行计数。
-
5. 找到第一个只出现一次的字符
for (char ch : s) {if (charCount[ch] == 1) {return string(1, ch); // 返回字符的字符串形式}
}
-
再次遍历字符串
s
,查找第一个只出现一次的字符:-
如果
charCount[ch] == 1
,则返回该字符的字符串形式(使用string(1, ch)
将字符转换为字符串)。
-
6. 如果没有找到唯一字符
return "no";
-
如果遍历结束后仍未找到任何只出现一次的字符,则返回
"no"
。
7. 主函数
int main() {string s;cin >> s;string result = firstUniqueChar(s);cout << result << endl;return 0;
}
-
主函数中读取字符串
s
,调用firstUniqueChar
函数获取结果,并输出结果。
总结
这段代码有效地找到了给定字符串中第一个只出现一次的字符,时间复杂度为 O(n),其中 n 是字符串的长度。使用 unordered_map
可以在 O(1) 时间内访问字符的计数。整体方法简单且高效,适合处理此类问题。
方法二:算法代码(使用数组实现哈希表)
#include <iostream>
#include <vector>
using namespace std;string firstUniqueChar(const string& s) {if (s.empty()) {return "no"; // 处理空字符串}vector<int> charCount(26, 0); // 初始化一个大小为26的数组,用于统计每个字母的出现次数// 统计每个字符的出现次数for (char ch : s) {if (ch >= 'a' && ch <= 'z') { // 确保只处理小写字母charCount[ch - 'a']++;}}// 找到第一个只出现一次的字符for (char ch : s) {if (ch >= 'a' && ch <= 'z' && charCount[ch - 'a'] == 1) {return string(1, ch); // 返回字符的字符串形式}}// 如果没有找到,返回 "no"return "no";
}int main() {string s;cin >> s;string result = firstUniqueChar(s);cout << result << endl;return 0;
}
1. 引入库和命名空间
#include <iostream>
#include <vector>
using namespace std;
-
#include <iostream>
: 引入输入输出流库,用于处理输入和输出。 -
#include <vector>
: 引入向量库,使得可以使用vector
容器。 -
using namespace std;
: 允许直接使用std
命名空间中的元素,避免在使用标准库函数时加上std::
前缀。
2. 定义首个唯一字符的函数
string firstUniqueChar(const string& s) {
-
firstUniqueChar
函数接受一个常量字符串引用s
,返回一个字符串。
3. 处理空字符串
if (s.empty()) {return "no"; // 处理空字符串
}
-
检查字符串是否为空。如果为空,则直接返回
"no"
。
4. 初始化字符计数数组
vector<int> charCount(26, 0); // 初始化一个大小为26的数组,用于统计每个字母的出现次数
-
创建一个大小为 26 的
vector<int>
数组charCount
,初始值都为 0。这个数组用于统计小写字母(’a’ 到 'z’)的出现次数。
5. 统计字符出现次数
for (char ch : s) {if (ch >= 'a' && ch <= 'z') { // 确保只处理小写字母charCount[ch - 'a']++;}
}
-
遍历字符串
s
,对于每个字符ch
:-
仅当字符是小写字母(’a’ 到 ‘z’)时,才对其进行统计。通过
charCount[ch - 'a']++
更新对应字母的计数。这里ch - 'a'
转换字符到数组索引(例如,’a’ 对应 0,’b’ 对应 1,以此类推)。
-
6. 找到第一个只出现一次的字符
for (char ch : s) {if (ch >= 'a' && ch <= 'z' && charCount[ch - 'a'] == 1) {return string(1, ch); // 返回字符的字符串形式}
}
-
再次遍历字符串
s
,查找第一个只出现一次的字符:-
如果字符是小写字母并且其计数为 1 (
charCount[ch - 'a'] == 1
),则返回该字符的字符串形式(使用string(1, ch)
将字符转换为字符串)。
-
7. 如果没有找到唯一字符
return "no";
-
如果遍历结束后仍未找到任何只出现一次的字符,则返回
"no"
。
8. 主函数
int main() {string s;cin >> s;string result = firstUniqueChar(s);cout << result << endl;return 0;
}
-
主函数中读取字符串
s
,调用firstUniqueChar
函数获取结果,并输出结果。
总结
这段代码有效地找到了给定字符串中第一个只出现一次的字符,时间复杂度为 O(n),其中 n 是字符串的长度。通过使用一个大小固定的数组来存储字符的计数,简化了字符计数的实现,同时提高了空间效率。这种方法简单而高效,适合处理此类问题。
评测记录:
三、B2112 石头剪子布 - 洛谷
算法代码:
#include<bits/stdc++.h>
using namespace std;
int main() {int n;cin>>n;for(int i=0; i<n; i++) {string a,b;cin>>a>>b;//读入两个字符串if(a[0]==b[0])cout<<"Tie\n";//首位相同,平局else if(a[0]=='R') {if(b[0]=='P')cout<<"Player2\n";else cout<<"Player1\n";}else if(a[0]=='P') {if(b[0]=='S')cout<<"Player2\n";else cout<<"Player1\n";}else if(a[0]=='S') {if(b[0]=='R')cout<<"Player2\n";else cout<<"Player1\n";}//以上是逐个判断,按照 Player1 的情况分类讨论//因为讨论过平局了,可以只分两种情况考虑//记得使用 else-if}return 0;
}
1. 引入库
#include <bits/stdc++.h>
using namespace std;
-
#include <bits/stdc++.h>
: 这是一个包含了大多数标准库的头文件,通常用于竞争性编程以减少代码的输入量。虽然在实际开发中不建议使用,但在比赛中常被使用。
2. 主函数
int main() {
-
程序的主入口。
3. 读取输入
int n;
cin >> n;
-
读取一个整数
n
,表示接下来要处理的对局数量。
4. 循环处理每局游戏
for (int i = 0; i < n; i++) {
-
使用
for
循环遍历每一局游戏。
5. 读取玩家的出手
string a, b;
cin >> a >> b; // 读入两个字符串
-
为每局读取两个字符串
a
和b
,分别代表玩家1和玩家2的出手。
6. 判断胜负
if (a[0] == b[0]) cout << "Tie\n"; // 首位相同,平局
-
如果玩家1和玩家2的出手相同(即两个字符串的第一个字符相同),则输出“平局”("Tie")。
7. 判断玩家1的胜负情况
else if (a[0] == 'R') {if (b[0] == 'P') cout << "Player2\n";else cout << "Player1\n";
}
else if (a[0] == 'P') {if (b[0] == 'S') cout << "Player2\n";else cout << "Player1\n";
}
else if (a[0] == 'S') {if (b[0] == 'R') cout << "Player2\n";else cout << "Player1\n";
}
-
对于玩家1的每种可能(’R’、’P’、’S’),使用
if-else
结构来判断其对应的输赢情况:-
如果玩家1出的是 'R’(石头):
-
如果玩家2出的是 'P’(布),则玩家2胜(输出 "Player2")。
-
否则,玩家1胜。
-
-
如果玩家1出的是 'P’(布):
-
如果玩家2出的是 'S’(剪子),则玩家2胜。
-
否则,玩家1胜。
-
-
如果玩家1出的是 'S’(剪子):
-
如果玩家2出的是 'R’(石头),则玩家2胜。
-
否则,玩家1胜。
-
-
8. 返回值
return 0;
-
返回 0,表示程序正常退出。
总结
这段代码实现了一个简单的“石头、剪子、布”游戏的逻辑。它通过判断两个玩家的出手情况,输出胜负结果。代码结构清晰,使用了 if-else
语句来处理不同的情况,时间复杂度为 O(n),其中 n 是输入的局数。这种实现是符合石头剪子布游戏规则的典型示例。
评测记录:
四、B2113 输出亲朋字符串 - 洛谷
算法代码:
#include <iostream>
#include <string>
using namespace std;string generateFriendString(const string& s) {string result;int n = s.length();for (int i = 0; i < n; ++i) {char newChar;if (i < n - 1) {newChar = s[i] + s[i + 1];} else {newChar = s[i] + s[0];}result += newChar;}return result;
}int main() {string inputStr;cin >> inputStr;string outputStr = generateFriendString(inputStr);cout << outputStr << endl;return 0;
}
1. 引入库和命名空间
#include <iostream>
#include <string>
using namespace std;
-
#include <iostream>
: 引入输入输出流库,用于处理输入和输出。 -
#include <string>
: 引入字符串库,以便使用string
类型。 -
using namespace std;
: 允许直接使用std
命名空间中的元素,避免在使用标准库函数时加上std::
前缀。
2. 定义生成 Friend String 的函数
string generateFriendString(const string& s) {
-
generateFriendString
函数接受一个常量字符串引用s
,返回一个字符串。
3. 初始化变量
string result;
int n = s.length();
-
创建一个空字符串
result
来存储生成的字符串。 -
获取字符串
s
的长度n
。
4. 遍历字符串
for (int i = 0; i < n; ++i) {
-
使用
for
循环遍历字符串的每个字符。
5. 生成新字符
char newChar;
if (i < n - 1) {newChar = s[i] + s[i + 1];
} else {newChar = s[i] + s[0];
}
-
创建字符变量
newChar
。 -
如果当前字符不是最后一个字符(
i < n - 1
),则将当前字符s[i]
和下一个字符s[i + 1]
相加,形成新的字符。 -
如果是最后一个字符(
i == n - 1
),则将该字符s[i]
和第一个字符s[0]
相加。
6. 添加新字符到结果字符串
result += newChar;
-
将生成的新字符
newChar
添加到结果字符串result
中。
7. 返回结果
return result;
-
返回生成的字符串。
8. 主函数
int main() {string inputStr;cin >> inputStr;string outputStr = generateFriendString(inputStr);cout << outputStr << endl;return 0;
}
-
主函数中读取输入字符串
inputStr
。 -
调用
generateFriendString
函数生成新字符串,并将结果存储在outputStr
中。 -
输出生成的字符串。
注意
需要注意的是,newChar = s[i] + s[i + 1];
这一行实际上是将两个字符的 ASCII 值相加,结果会超出字符范围并无法直接表示为字符。这将导致 newChar
并不是一个有效的字符,可能会引发未定义行为。
代码改进建议
如果想要将两个字符相加并保持在字符范围内,可以考虑将结果取模(例如,使用 % 256
),或者根据需求定义如何处理字符的组合。例如:
newChar = (s[i] + s[i + 1]) % 256; // 保持在有效字符范围内
或者,可以考虑使用字符串拼接,而不是将字符相加。具体实现取决于所需的逻辑和输出格式。
总结
这段代码时间复杂度为O(n),展示了如何基于输入字符串生成一个新字符串的基本思路,但在字符相加的部分需要谨慎处理,以确保生成的字符在有效范围内。
评测记录:
五、B2114 配对碱基链 - 洛谷
方法一:算法代码(使用map一一对应)
#include<bits/stdc++.h>
using namespace std;
char a[1000];//char型数组存字符串
int lena;
map <char,char>ch;//map一一对应
int main()
{cin>>a;lena=strlen(a);//strlen函数返回数组长度 ch['A']='T';ch['T']='A';ch['C']='G';ch['G']='C';//一一对应 for(int i=0;i<lena;i++) cout<<ch[a[i]];//输出 return 0;
}
1. 引入库
#include <bits/stdc++.h>
using namespace std;
-
#include <bits/stdc++.h>
: 这个头文件包含了几乎所有的标准库,通常在竞争性编程中使用以节省输入时间。
2. 定义全局变量
char a[1000]; // char型数组存储字符串
int lena;
map <char,char> ch; // map用于存储碱基一一对应关系
-
char a[1000];
: 定义一个字符数组a
,用于存储输入的 DNA 字符串,最大长度为 999 个字符(最后一个字符为字符串结束符\0
)。 -
int lena;
: 定义一个整数变量lena
,用于存储字符串的长度。 -
map <char,char> ch;
: 定义一个字符映射ch
,用于存储 DNA 碱基的互补关系。
3. 主函数
int main() {
-
程序的主入口。
4. 读取输入
cin >> a;
lena = strlen(a); // 用 strlen 函数返回数组长度
-
从标准输入读取一个 DNA 字符串并存储到数组
a
中。 -
使用
strlen(a)
函数获取字符串的长度,并存储在lena
中。
5. 定义碱基配对关系
ch['A'] = 'T';
ch['T'] = 'A';
ch['C'] = 'G';
ch['G'] = 'C'; // 定义碱基的互补关系
-
使用
map
来定义碱基之间的互补关系:-
‘A’ 与 ‘T’ 互补
-
‘T’ 与 ‘A’ 互补
-
‘C’ 与 ‘G’ 互补
-
‘G’ 与 ‘C’ 互补
-
6. 输出互补序列
for (int i = 0; i < lena; i++) cout << ch[a[i]]; // 输出互补序列
-
使用
for
循环遍历输入字符串的每个字符,并通过map
ch
输出互补碱基。
7. 返回值
return 0;
-
返回 0,表示程序正常退出。
总结
这段代码实现了一个简单的 DNA 互补序列生成器。它通过读取一个 DNA 序列并利用 map
存储碱基之间的互补关系,然后输出对应的互补序列。代码结构清晰,能够有效处理 DNA 碱基互补逻辑,时间复杂度为 O(n),其中 n 是输入 DNA 序列的长度。
方法二:算法代码(直接替换)
#include <bits/stdc++.h>
using namespace std;
char s[10001];
int main(){cin>>s;for (int i=0;i<strlen(s);i++)if (s[i]=='A') cout<<"T";else if (s[i]=='G') cout<<"C";else if (s[i]=='T') cout<<"A";else if (s[i]=='C') cout<<"G";return 0;
}
1. 引入库
#include <bits/stdc++.h>
using namespace std;
-
#include <bits/stdc++.h>
: 这是一个包含了大多数标准库的头文件,通常用于竞争性编程以减少代码的输入量。
2. 定义字符数组
char s[10001];
-
char s[10001];
: 定义一个字符数组s
,用于存储输入的 DNA 字符串,最大长度为 10000 个字符(最后一个字符为字符串结束符\0
)。
3. 主函数
int main() {
-
程序的主入口。
4. 读取输入
cin >> s;
-
从标准输入读取一个 DNA 字符串并将其存储在数组
s
中。
5. 遍历字符串并转换碱基
for (int i = 0; i < strlen(s); i++) {if (s[i] == 'A') cout << "T";else if (s[i] == 'G') cout << "C";else if (s[i] == 'T') cout << "A";else if (s[i] == 'C') cout << "G";
}
-
使用
for
循环遍历字符串s
的每个字符:-
如果当前字符是 'A’,则输出 'T’(A 的互补碱基)。
-
如果当前字符是 'G’,则输出 'C’(G 的互补碱基)。
-
如果当前字符是 'T’,则输出 'A’(T 的互补碱基)。
-
如果当前字符是 'C’,则输出 'G’(C 的互补碱基)。
-
6. 返回值
return 0;
-
返回 0,表示程序正常退出。
总结
这段代码实现了一个简单的 DNA 互补序列生成器。通过读取一个 DNA 序列并根据碱基的配对规则输出对应的互补碱基,它的时间复杂度为 O(n),其中 n 是输入 DNA 序列的长度。
改进建议
尽管这段代码功能正常,但有几个改进点可以考虑:
-
使用
strlen
的优化:每次调用strlen(s)
会遍历整个字符串,导致效率下降。可以在循环开始前缓存字符串的长度:int len = strlen(s); for (int i = 0; i < len; i++) { ... }
-
使用
switch
语句:使用switch
语句可以使代码更简洁、易读:switch (s[i]) {case 'A': cout << "T"; break;case 'G': cout << "C"; break;case 'T': cout << "A"; break;case 'C': cout << "G"; break; }
-
输入限制:可以加上对输入字符串的有效性检查,确保只有合法的 DNA 碱基被处理。
-
输出格式:在某些情况下,可能需要换行或分隔符来格式化输出。
以下是改进后的代码示例:
#include <bits/stdc++.h>
using namespace std;char s[10001];int main() {cin >> s;int len = strlen(s); // 缓存字符串长度for (int i = 0; i < len; i++) {switch (s[i]) {case 'A': cout << "T"; break;case 'G': cout << "C"; break;case 'T': cout << "A"; break;case 'C': cout << "G"; break;}}return 0;
}
通过这些改进,代码会更加高效和清晰。
测评记录:
六、 B2116 加密的病历单 - 洛谷
算法代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;string decryptString(const string& s) {string result = s;// 1. 大小写反转for (char& c : result) {if (isupper(c)) {c = tolower(c);} else if (islower(c)) {c = toupper(c);}}// 2. 逆序存储reverse(result.begin(), result.end());// 3. 字符循环右移三个位置for (char& c : result) {if (isalpha(c)) {if (isupper(c)) {c = 'A' + (c - 'A' + 3) % 26;} else {c = 'a' + (c - 'a' + 3) % 26;}}}return result;
}int main() {string inputStr;cin >> inputStr;string outputStr = decryptString(inputStr);cout << outputStr << endl;return 0;
}
1. 引入库
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
-
#include <iostream>
: 引入输入输出流库,用于处理输入和输出。 -
#include <string>
: 引入字符串库,以便使用string
类型。 -
#include <algorithm>
: 引入算法库,以便使用标准算法,例如reverse
。
2. 定义解密函数
string decryptString(const string& s) {
-
decryptString
函数接受一个常量字符串引用s
,返回一个解密后的字符串。
3. 初始化结果字符串
string result = s;
-
创建一个新的字符串
result
,并将输入字符串s
复制到result
中。
4. 步骤 1:大小写反转
for (char& c : result) {if (isupper(c)) {c = tolower(c);} else if (islower(c)) {c = toupper(c);}
}
-
使用范围
for
循环遍历result
中的每个字符c
:-
如果
c
是大写字母,则将其转换为小写字母。 -
如果
c
是小写字母,则将其转换为大写字母。
-
5. 步骤 2:逆序存储
reverse(result.begin(), result.end());
-
使用
reverse
函数将result
字符串中的字符顺序反转。
6. 步骤 3:字符循环右移三个位置
for (char& c : result) {if (isalpha(c)) {if (isupper(c)) {c = 'A' + (c - 'A' + 3) % 26;} else {c = 'a' + (c - 'a' + 3) % 26;}}
}
-
再次使用范围
for
循环遍历result
中的每个字符c
:-
检查字符是否为字母(
isalpha(c)
)。 -
如果是大写字母,计算循环右移后的新字符:
-
使用
c - 'A'
将字母转换为 0 到 25 的范围,加上 3 后再取模 26,最后通过'A' +
将其转换回字符。
-
-
如果是小写字母,执行相同的操作,但使用
'a'
为基准。为什么使用模运算(
% 26
) -
字母表有 26 个字母(A-Z 或 a-z),因此字符的偏移量必须在 0 到 25 之间。
-
当字符的偏移量增加 3 后,可能会超出 25(例如,
'x'
的偏移量是 23,增加 3 后变为 26)。 -
使用模运算
% 26
可以确保偏移量循环回到字母表的开头:-
例如,
26 % 26 = 0
,对应字母'a'
或'A'
。 -
这样,字符的移动是循环的,不会超出字母表的范围。
-
-
7. 返回结果
return result;
-
返回解密后的字符串。
8. 主函数
int main() {string inputStr;cin >> inputStr;string outputStr = decryptString(inputStr);cout << outputStr << endl;return 0;
}
-
主函数中读取输入字符串
inputStr
。 -
调用
decryptString
函数生成解密后的字符串,并将结果存储在outputStr
中。 -
输出解密后的字符串。
总结
这段代码有效地实现了一种字符串解密的方式。通过对输入字符串进行大小写反转、逆序和字符循环右移三个步骤,生成了新的字符串。时间复杂度为 O(n),其中 n 是输入字符串的长度。
评测记录:
七、B2117 整理药名 - 洛谷
算法代码:
#include<bits/stdc++.h>
using namespace std;
int n,lena;
char a[30];//char型数组存字符串
int main()
{cin>>n;for(int i=0;i<n;i++){cin>>a;lena=strlen(a);;//strlen返回char型数组的长度if(islower(a[0])) a[0]-=32;//判断开头字符是否是小写字母,若是,则转化为大写for(int j=1;j<lena;j++) if(isupper(a[j])) a[j]+=32;//判断其他字符是否为大写字母,若是,则转化为小写cout<<a<<endl;}return 0;
}
1. 引入必要的库
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
-
引入
<iostream>
进行输入输出操作。 -
引入
<string>
以使用 C++ 的string
类型。 -
引入
<algorithm>
以使用一些算法函数,比如toupper
和tolower
。
2. 定义主函数
int main() {
-
定义程序的主入口。
3. 读取字符串数量
int n;
cin >> n;
cin.ignore(); // 忽略换行符
-
声明一个整数
n
用于存储将要处理的字符串数量。 -
使用
cin >> n;
读取数量。 -
使用
cin.ignore();
忽略后续的换行符,以便正确读取字符串。
4. 循环处理每个字符串
for (int i = 0; i < n; i++) {string a;getline(cin, a); // 使用 getline 读取字符串
-
使用
for
循环遍历每个字符串。 -
声明一个
string
类型的变量a
来存储当前字符串。 -
使用
getline(cin, a);
读取整行输入的字符串。
5. 格式化首字母为大写
if (islower(a[0])) {a[0] = toupper(a[0]); // 将首字母转为大写
}
-
检查字符串的第一个字符是否为小写字母(
islower
)。 -
如果是,则使用
toupper
将其转换为大写。
6. 格式化其他字符为小写
for (int j = 1; j < a.length(); j++) {a[j] = tolower(a[j]); // 将剩余字符转为小写
}
-
使用
for
循环遍历从第二个字符开始的每个字符。 -
使用
tolower
将每个大写字母转换为小写。
7. 输出格式化后的字符串
cout << a << endl; // 输出结果
-
输出格式化后的字符串
a
。
8. 结束主函数
return 0;
}
-
使用
return 0;
表示程序正常结束。
完整代码示例
#include <iostream>
#include <string>
#include <algorithm>using namespace std;int main() {int n;cin >> n;cin.ignore(); // 忽略换行符for (int i = 0; i < n; i++) {string a;getline(cin, a); // 使用 getline 读取字符串// 将首字母转为大写if (islower(a[0])) {a[0] = toupper(a[0]);}// 将剩余字符转为小写for (int j = 1; j < a.length(); j++) {a[j] = tolower(a[j]);}cout << a << endl; // 输出结果}return 0;
}
总结
程序的时间复杂度是 ( O(n \cdot L) ),其中 ( n ) 是字符串的数量,( L ) 是每个字符串的平均长度。
评测记录:
八、B2118 验证子串 - 洛谷
算法代码:
#include<bits/stdc++.h>
using namespace std;
string a,b;
int main()
{cin>>a>>b;if(a.find(b)!=a.npos) //如果b是a的子串 {cout<<b<<" is substring of "<<a<<endl;}else if(b.find(a)!=b.npos) //如果a是b的子串 {cout<<a<<" is substring of "<<b<<endl;}else //如果没有子串关系 {cout<<"No substring"<<endl;}return 0;
}
1、代码思路:
-
输入两个字符串:从标准输入读取两个字符串
a
和b
。 -
判断子串关系:
-
使用
a.find(b)
检查b
是否是a
的子串。 -
如果
b
是a
的子串,输出b is substring of a
。 -
否则,使用
b.find(a)
检查a
是否是b
的子串。 -
如果
a
是b
的子串,输出a is substring of b
。 -
如果两者都不是对方的子串,输出
No substring
。
-
-
结束程序:返回 0,表示程序正常结束。
2、代码解释:
-
a.find(b)
:在字符串a
中查找子串b
。如果找到,返回子串的起始位置;否则返回string::npos
。 -
b.find(a)
:在字符串b
中查找子串a
。如果找到,返回子串的起始位置;否则返回string::npos
。 -
if-else
结构:根据查找结果判断子串关系,并输出相应的信息。
3、代码优化建议:
-
输入处理:确保输入的两个字符串不为空,避免不必要的错误。
-
大小写敏感:如果希望忽略大小写,可以在查找前将字符串统一转换为小写或大写。
-
边界情况:考虑空字符串的情况,避免程序崩溃。
4、优化后的代码:
#include<bits/stdc++.h>
using namespace std;int main()
{string a, b;cin >> a >> b;if (a.empty() || b.empty()) {cout << "No substring" << endl;return 0;}if (a.find(b) != string::npos) {cout << b << " is substring of " << a << endl;} else if (b.find(a) != string::npos) {cout << a << " is substring of " << b << endl;} else {cout << "No substring" << endl;}return 0;
}
5、优化点解释:
-
空字符串检查:在查找子串之前,检查
a
和b
是否为空字符串。如果为空,直接输出No substring
。 -
代码简洁性:保持代码逻辑清晰,易于理解。
评测记录
九、B2119 删除单词后缀 - 洛谷
算法代码:
#include <iostream>
#include <string>using namespace std;string removeSuffix(const string& word) {if (word.length() >= 2 && word.substr(word.length() - 2) == "er") {return word.substr(0, word.length() - 2);}if (word.length() >= 2 && word.substr(word.length() - 2) == "ly") {return word.substr(0, word.length() - 2);}if (word.length() >= 3 && word.substr(word.length() - 3) == "ing") {return word.substr(0, word.length() - 3);}return word;
}int main() {string word;cin >> word;cout << removeSuffix(word) << endl;return 0;
}
1、代码思路:
-
输入处理:
-
从标准输入读取一个单词。
-
确保单词的长度不超过题目要求的最大长度(32个字符)。
-
-
后缀检查与删除:
-
检查单词是否以
er
结尾。如果是,删除最后两个字符。 -
检查单词是否以
ly
结尾。如果是,删除最后两个字符。 -
检查单词是否以
ing
结尾。如果是,删除最后三个字符。 -
如果单词不以任何指定的后缀结尾,则保持不变。
-
-
输出结果:
-
输出处理后的单词。
-
2、具体实现步骤:
-
读取输入:
-
使用
cin
读取输入的单词。
-
-
后缀检查:
-
使用
substr
方法检查单词的最后几个字符是否与目标后缀匹配。 -
如果匹配,使用
substr
方法删除后缀。
-
-
输出结果:
-
使用
cout
输出处理后的单词。
-
评测记录:
十、 B2120 单词的长度 - 洛谷
算法代码:
#include <bits/stdc++.h>using namespace std;int main() {string s;bool flag = true;while (cin >> s) {if (flag) {flag = false;cout << s.size();} else {cout << ',' << s.size();}}return 0;
}
-
引入库
#include <bits/stdc++.h>
-
引入标准库,提供各种数据结构和算法的支持。
-
-
定义主函数
int main() {
-
程序的主入口。
-
-
声明变量
string s; bool flag = true;
-
声明一个字符串变量
s
用于存储输入的每个单词。 -
声明一个布尔变量
flag
,初始值为true
,用于控制输出格式。
-
-
循环读取输入
while (cin >> s) {
-
使用
while
循环从标准输入中读取字符串s
,直到输入结束。
-
-
处理第一次输入
if (flag) {flag = false;cout << s.size(); }
-
在第一次读取字符串时(即
flag
为true
),输出字符串s
的长度,并将flag
设置为false
,以便后续输入的处理。
-
-
处理后续输入
else {cout << ',' << s.size(); }
-
对于后续读取的字符串,输出一个逗号
,
,然后输出字符串s
的长度。
-
-
结束主函数
return 0; }
-
返回 0,表示程序正常结束。
-
总结
该程序的功能是从标准输入中逐个读取字符串,并输出每个字符串的长度。对于第一个字符串,它直接输出长度;对于后续的字符串,它在长度前添加一个逗号分隔符。最终输出的是所有输入字符串长度的逗号分隔列表。综上所述,循环体内的操作(读取字符串、计算长度和输出长度)都是 ( O(1) ) 的,因此整个程序的时间复杂度为: [ O(n) ] 其中 ( n ) 是输入中字符串的数量。也就是说,程序的运行时间是线性于输入字符串数量的。
评测记录:
相关文章:
STL —— 洛谷字符串(string库)入门题(蓝桥杯题目训练)(一)
目录 一、B2109 统计数字字符个数 - 洛谷 算法代码: 1. 引入库和命名空间 2. 主函数 3. 读取输入 4. 变量初始化 5. 遍历字符串 6. 输出结果 7. 返回值 总结 评测记录: 二、B2110 找第一个只出现一次的字符 - 洛谷 方法一:算法代…...
游戏引擎学习第107天
仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾我们之前停留的位置 在这段内容中,讨论了如何处理游戏中的三维效果,特别是如何处理额外的“Z层”。由于游戏中的艺术资源是位图而不是3D模型,因此实现三维效果变得非常具有挑战性。虽然可…...
网页制作01-html,css,javascript初认识のhtml的基本标记
一、 Html简介 英文全称是 hyper text markup language,超文本标记语言,是全球广域网上描述网页内容和外观的标准. Html作为一款标记语言,本身不能显示在浏览器中.标记语言经过浏览器的解释和编译,才能正确地反映html标记语言的内容. 1.html 的基本标记 1)头部标…...
WebSocket在分布式环境中的局限性及解决方案
WebSocket 在分布式环境中存在一些局限性,特别是当系统需要扩展多个服务实例时,单个 WebSocket 连接的管理和消息推送就变得比较复杂。因此,必须采取一些额外的措施来确保 WebSocket 能在多个服务实例之间正确工作。 WebSocket 在分布式环境…...
Windows日志分析
查看服务日志文件 windows下我们可以通过时间查看器来查看windows系统下服务,应用,系统等产生的事件以及日志 1.打开方式是: winr 输入eventvwr.msc 2.控制面板--系统与安全--事件查看器 事件类型分为5种 错误:标识问题很严重…...
青少年编程与数学 02-009 Django 5 Web 编程 20课题、测试
青少年编程与数学 02-009 Django 5 Web 编程 20课题、测试 一、软件测试二、自动化测试三、单元测试四、Django 单元测试(一)、创建测试用例(二)、运行测试(三)、常用测试功能 课题摘要: 本文全面介绍了软件…...
WPF 中为 Grid 设置背景图片全解析
WPF 中为 Grid 设置背景图片全解析 在 WPF(Windows Presentation Foundation)开发中,界面的美观度是吸引用户的重要因素之一。而添加背景图片是提升界面视觉效果的常见手段。今天,我们就来深入探讨在 WPF 里如何为 Grid 设置背景…...
3.10 实战Hugging Face Transformers:从文本分类到模型部署全流程
实战Hugging Face Transformers:从文本分类到模型部署全流程 一、文本分类实战:IMDB电影评论情感分析 1.1 数据准备与预处理 from datasets import load_dataset from transformers import AutoTokenizer # 加载IMDB数据集 dataset = load_dataset("imdb") …...
Android中获取so文件来源于哪个库
Android app中可能有很多的.so文件,有时我们不确定这些.so文件都是来源于哪些库的,可以通过在build.gradle中添加代码来统计。具体方法如下: 1.在com.android.application模块的build.gradle文件最后添加如下代码: // 获取所有的…...
地面沉降监测,为地质安全保驾护航
地面沉降,不容忽视的城市隐患 随着城市化进程的加速,大规模的工程建设、地下水过度开采等因素,导致地面沉降现象日益严重。地面沉降不仅会使建筑物开裂、倾斜,影响其使用寿命和安全性,还会破坏地下管线,引…...
宝塔docker 安装oracle11G
1、拉取镜像 sudo docker pull iatebes/oracle_11g #iatebes为用户名2、查看镜像 sudo docker images3、创建并运行容器 docker run -d --privileged --name oralce11g -p 1521:1521 iatebes/oracle_11g4、登录到容器 5、进入容器并修改system用户密码 docker exec -it orac…...
unity学习39:连续动作之间的切换,用按键控制角色的移动
目录 1 不同状态之间的切换模式 1.1 在1个连续状态和一个连续状态之间的transition,使用trigger 1.2 在2个连续状态之间的转换,使用bool值切换转换 2 至少现在有2种角色的移动控制方式 2.1 用CharacterController 控制角色的移动 2.2 用animator…...
DeepSeek等大模型功能集成到WPS中的详细步骤
记录下将**DeepSeek功能集成到WPS中**的步骤,以备忘。 1. 下载并安装OfficeAI插件 访问OfficeAI插件下载地址:https://www.office-ai.cn/,下载插件(目前只支持windows系统)。 注意,有两个插件࿰…...
基于Python的Flask微博话题舆情分析可视化系统
✅️配套lun文 1w9字 ✅️爬虫可用 12月数据 ✅️实时微博热点分析 技术栈:爬虫➕Flask后端框架➕bert深度学习模型➕mysql数据库系统功能:爬取微博数据(可以是同类型文章或者制定文章),微博文章情感分析,微博评论情感…...
服务器A到服务器B免密登录
#!/bin/bash # 变量定义 source_host"192.168.42.250" # 源主机 IP target_host"192.168.24.43" # 目标主机 IP target_user"nvidia" # 目标主机的用户名 ssh_port"6666" # SSH 端口号 # 生成 SSH…...
Unity中可靠的UDP实现
可靠 UDP(Reliable UDP)是一种在用户数据报协议(UDP)基础上,通过添加额外机制来实现可靠数据传输的技术。与传统 UDP 相比,它克服了 UDP 本身不保证数据可靠性、顺序性以及可能丢失数据的缺点,同…...
轮播图html
题十二:轮播图 要求: 1.鼠标不在图片上方时,进行自动轮播,并且左右箭头不会显示;当鼠标放在图片上方时,停止轮播,并且左右箭头会显示; 2.图片切换之后,图片中下方的小圆…...
二十多年前的苹果电源Power Mac G4 Mdd 电源接口
在1999年,苹果推出了最初的Power Mac G4电脑。第一代Power Mac G4有与G3系列相似的外壳和两种主板设置,分别使用PCI和AGP显示总线。第二代电脑被昵称为快银或水银机,来自2001年的它们有更高速的PowerPC 7450系列芯片,增强了L2缓存…...
java听书项目
项目的架构 网关:1路由转发 2.认证鉴权(token)3.统一处理(跨域) Mysql:关系型数据库 ES:搜索数据库 Redis:页面级缓存,会话状态存储 GitLab:私有托管平台 K8S:自动化部署、扩展和管理容器化应用程序的开源系统 Jenkins:自动化部署 1.环境搭建 创建一个父工程…...
RadASM环境,win32汇编入门教程之三
;运行效果 ;win32汇编环境,RadAsm入门教程之三 ;在这个教程里,我们学一下如何增加控件,比如按钮,其它的控件类似这样增加 ;以下的代码就是在教程一的窗口模版里增加一个按钮控件,可以比较一下,增加了什么内…...
【机器学习】线性回归 多元线性回归
【机器学习系列】 KNN算法 KNN算法原理简介及要点 特征归一化的重要性及方式线性回归算法 线性回归与一元线性回归 线性回归模型的损失函数 多元线性回归 多项式线性回归 多元线性回归 V1.0多元线性回归一元线性回归与多元线性回归多元线性回归模型的误差衡量多元线性回归的最…...
线性代数中的正交和标准正交向量
在线性代数中,理解正交向量和正交向量至关重要,尤其是对于机器学习中的应用。这篇博文将简化这些概念,而不会太深入地深入研究复杂的数学。 正交向量 如果两个向量的点积等于零,则认为这两个向量是正交的。但点积到底是什么呢&am…...
Vue 项目登录的基本流程
Vue 用户登录的基本流程包括以下6个步骤: 步骤: 1. 创建登录表单 在前端,首先要创建一个登录表单,用户输入账号(用户名、邮箱、手机号等)和密码。 示例:Login.vue <template><div…...
坐井说天阔---DeepSeek-R1
前言 DeepSeek-R1这么火,虽然网上很多介绍和解读,但听人家的总不如自己去看看原论文。于是花了大概一周的时间,下班后有进入了研究生的状态---读论文。 DeepSeek这次的目标是探索在没有任何监督数据的情况下训练具有推理能力的大模型&#…...
Spring 是如何解决循环依赖问题的?
Spring框架通过使用三级缓存机制来解决单例Bean之间的循环依赖问题。以下是详细的解释,包括循环依赖的概念、Spring的解决方案以及三级缓存的具体作用。 什么是循环依赖? 循环依赖是指两个或多个Bean之间相互依赖,形成一个闭环。例如&#…...
【数据可视化-17】基于pyecharts的印度犯罪数据可视化分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
thingboard告警信息格式美化
原始报警json内容: { "severity": "CRITICAL","acknowledged": false,"cleared": false,"assigneeId": null,"startTs": 1739801102349,"endTs": 1739801102349,"ackTs": 0,&quo…...
Javaweb中,使用Servlet编写简单的接口
案例:网页提交用户名和密码信息,后端校验密码长度需在6-12位之间 后端部分 WebServlet("/valid") public class SimpleServlet extends HttpServlet{public void service(HttpServletRequest req, HttpServletResponse resp) throws IOExcepti…...
三层渗透测试-DMZ区域 二三层设备区域
DMZ区域渗透 信息收集 首先先进行信息收集,这里我们可以选择多种的信息收集方式,例如nmap如此之类的,我的建议是,可以通过自己现有的手里小工具,例如无影,密探这种工具,进行一个信息收集。以免…...
Java 开发者需要了解的 PDF 基础知识
PDF 代表“可移植文档格式”(Portable Document Format),它是全球最流行的文件格式。因此,Java 开发人员很可能会经常需要处理它。然而,与 Microsoft Word 或 HTML/XML 这样的格式相比,PDF 并不那么直观。理…...
基于图像处理的裂缝检测与特征提取
一、引言 裂缝检测是基础设施监测中至关重要的一项任务,尤其是在土木工程和建筑工程领域。随着自动化技术的发展,传统的人工巡检方法逐渐被基于图像分析的自动化检测系统所取代。通过计算机视觉和图像处理技术,能够高效、精确地提取裂缝的几何特征,如长度、宽度、方向、面…...
Webpack 基础入门
一、Webpack 是什么 Webpack 是一款现代 JavaScript 应用程序的静态模块打包工具。在 Web 开发中,我们的项目会包含各种类型的文件,如 JavaScript、CSS、图片等。Webpack 可以将这些文件打包成一个或多个文件,以便在浏览器中高效加载。它就像…...
掌握SQLite_轻量级数据库的全面指南
1. 引言 1.1 SQLite简介 SQLite 是一个嵌入式关系型数据库管理系统,它不需要单独的服务器进程或系统配置。它的设计目标是简单、高效、可靠,适用于各种应用场景,尤其是移动设备和嵌入式系统。 1.2 为什么选择SQLite 轻量级:文件大小通常在几百KB到几MB之间。无服务器架构…...
大数据处理如何入门
大数据处理的入门可以从以下几个方面入手: 1. 基础知识学习 在深入大数据领域之前,建议先掌握一些基础知识,包括数据类型、存储与处理的基本概念,以及常用的数据处理工具。例如,Python或Java编程语言在大数据领域应用…...
算法与数据结构(最小栈)
题目 思路 为了返回栈中的最小元素,我们需要额外维护一个辅助栈 min_stack,它的作用是记录当前栈中的最小值。 min_stack的作用: min_stack的栈顶元素始终是当前栈 st 中的最小值。 每当st中压入一个新元素时,如果这个元素小于等…...
LeetCode 1287.有序数组中出现次数超过25%的元素:遍历
【LetMeFly】1287.有序数组中出现次数超过25%的元素:遍历 力扣题目链接:https://leetcode.cn/problems/element-appearing-more-than-25-in-sorted-array/ 给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出…...
春招项目=图床+ k8s 控制台(唬人专用)
1. 春招伊始 马上要春招了,一个大气的项目(冲击波项目)直观重要,虽然大家都说基础很重要,但是一个足够新颖的项目完全可以把你的简历添加一个足够闪亮的点。 这就不得不推荐下我的 k8s 图床了,去年折腾快…...
Vue 记录用户进入页面的时间、离开页面的时间并计算时长
在 Vue 项目中,要记录用户进入页面的时间、离开页面的时间,并在用户离开时计算时长并调用后端接口,可以借助 Vue 的生命周期钩子和浏览器的一些事件来实现。以下是具体的实现步骤和示例代码: 实现思路 记录进入时间:…...
解锁豆瓣高清海报(三)从深度爬虫到URL构造,实现极速下载
脚本地址: 项目地址: Gazer PosterBandit_v2.py 前瞻 之前的 PosterBandit.py 是按照深度爬虫的思路一步步进入海报界面来爬取, 是个值得学习的思路, 但缺点是它爬取慢, 仍然容易碰到豆瓣的 418 错误, 本文也会指出彻底解决旧版 418 错误的方法并提高爬取速度. 现在我将介绍…...
机器学习--逻辑回归
机器学习–逻辑回归 一、认知革命:从线性回归到逻辑回归 1.1 本质差异对比 维度线性回归逻辑回归输出类型连续值概率值 (0-1)目标函数最小二乘法极大似然估计数学表达式 y w T x b yw^Txb ywTxb p 1 1 e − ( w T x b ) p\frac{1}{1e^{-(w^Txb)}} p1e−(wTxb…...
gradio创建openai前端对接deepseek等模型流式输出markdown格式文本
环境 gradio3.50.2 openai1.63.1代码 import openai import gradio as gr#导入gradio的包api_key "sk-**a8" api_base "https://api.deepseek.com/v1"import gradio as gr import openai from typing import List, Any, Iteratorclient openai.OpenAI…...
【LeetCode Hot100】最大子数组和|动态规划/贪心,Java实现!图解+代码,小白也能秒懂!
💻 [LeetCode Hot100] 最大子数组和|动态规划/贪心,Java实现!图解代码,小白也能秒懂! ✏️本文对应题目链接:最大子数组和 📌 题目描述 给定一个整数数组 nums,找到一个…...
【Go语言快速上手】第二部分:Go语言进阶之网络编程
文章目录 前言:网络编程一、TCP/UDP 编程:net 包的使用1. TCP 编程1.1 TCP 服务器1.2 TCP 客户端 2. UDP 编程2.1 UDP 服务器2.2 UDP 客户端 二、HTTP 编程:net/http 包的使用,编写 HTTP 服务器和客户端2.1 HTTP 服务器2.2 HTTP 客…...
AI法理学与责任归属:技术演进下的法律重构与伦理挑战
文章目录 引言:智能时代的新型法律困境一、AI技术特性对传统法理的冲击1.1 算法黑箱与可解释性悖论1.2 动态学习系统的责任漂移1.3 多智能体协作的责任稀释二、AI法理学的核心争议点2.1 法律主体资格认定2.2 因果关系的技术解构2.3 过错标准的重新定义三、责任归属的实践案例分…...
Linux探秘坊-------8.进程详解
1.概念详解 1.运行&&阻塞&&挂起 内容基础:方框中的就是调度队列,是一个 双向队列,每一个元素是PCB其对应的代码数据 1.运行 只要进程 在调度队列中,进程的状态就是运行(running). 2.阻塞…...
C#使用文件读写操作实现仙剑五前传称号存档修改
手把手教学仙剑五前传 称号存档修改器 首先找到 Pal5Q所在目录的save\global.sav 文件,这是一个只有488字节的文件,这里存放称号对应的编号ID,以及是否已获得该称号,1为已获取称号,0为未获取称号 [称号:是否获取]这是一个键值对 称号的编号ID是一个Int32数字,使用C#的方法Bi…...
Kubernetes知识点总结(十)
什么是 K8s 的 namespace? 在 K8s 中,Namespace(名字空间)提供了一种机制,将同一集群中的资源划分为相互隔离的组, 是在多个用户之间划分集群资源的一种方法。 名字空间作用域仅针对带有名字空间的对…...
【达梦数据库】disql工具参数绑定
前言 在达梦数据库的使用过程中尽管管理工具很好用,但是命令行工具还是有着得天独厚的优势,但是在参数绑定方面就没有管理工具做的更加完美,现在就汇总下disql 工具参数绑定的常用几种方式 disql 参数绑定 使用 ? select * from v$dm_in…...
箭头函数的this指向谁
先看1个重要原则: 由Vue管理的函数,一定不要写箭头函数,箭头函数的this就不再是Vue实例了 箭头函数的 this 指向在定义时确定,继承自外层作用域(即定义时的上下文)的 this,且无法通过 call、app…...
Node.js技术原理分析系列——Node.js调试能力分析
本文由体验技术团队屈金雄原创。 Node.js 是一个开源的、跨平台的 JavaScript 运行时环境,它允许开发者在服务器端运行 JavaScript 代码。Node.js 是基于 Chrome V8引擎构建的,专为高性能、高并发的网络应用而设计,广泛应用于构建服务器端应…...