2026.2.20——OJ92-94题

T92:字符串统计------字符串

代码实现:

#include <iostream>

#include <string>

using namespace std;

int main(){

string s1,s2;

bool firstgroup=true;

while(cin>>s1>>s2){

if(!firstgroup){

cout<<endl;

}

firstgroup=false;

//标记字母是否出现在s1和s2中

bool ins1[26]={false};

bool ins2[26]={false};

for(char c:s1)ins1[c-'a']=true;//s1中出现的字符,对应位置标为true

for(char c:s2)ins2[c-'a']=true;//s2中出现的字符,对应位置标为true

//存放四种结果

string orstr,andstr,xorstr,notstr;

for(int i=0;i<26;i++){

char ch='a'+i;

if(ins1[i]||ins2[i]) orstr.push_back(ch);

if(ins1[i]&&ins2[i]) andstr.push_back(ch);

if(ins1[i]!=ins2[i]) xorstr.push_back(ch);

if(!ins1[i]&&!ins2[i]) notstr.push_back(ch);

}

//输出四行

cout<<"in s1 or s2:"<<orstr<<endl;

cout<<"in s1 and s2:"<<andstr<<endl;

cout<<"in s1 but not in s2 ,or in s2 but not in s1:"<<xorstr<<endl;

cout<<"not in s1 and s2:"<<notstr<<endl;

}

return 0;

}

个人思考:

这道题需要将两个字符串的每个字符出现存在对应的布尔数组里,构造四种结果字符串,i从0遍历到25,通过双目运算符来判断四种情况属于哪一种,将对应的结果加入结果字符串中。

T93:隐藏口令------字符串

代码实现:

#include <iostream>

#include <string>

using namespace std;

// 最小表示法,返回最小表示起始位置(0-based)

int minfunction(const string &s, int n) {

int i = 0, j = 1, k = 0;

while (i < n && j < n && k < n) {

int a = s[(i + k) % n];

int b = s[(j + k) % n];

if (a == b) {

++k;

} else {

if (a > b) i = i + k + 1;

else j = j + k + 1;

if (i == j) ++j;

k = 0;

}

}

return min(i, j);

}

int main() {

int L;

cin >> L;// 读取长度

string s, line;

while (cin >> line) {// 逐词读入,自动跳过换行和空格

s += line;

if (s.size() >= L) break;

}

s = s.substr(0, L);//只取前 L 个字符

int pos = minfunction(s, L);

cout << pos << endl;//起始位置减 1 即为口令

return 0;

}

个人思考:

这道题的关键就是最小起始位置的寻找,用三个指针来标记,两个是比较的位置,还有一个是用来表示从这两个位置开始已经成功匹配的字符数。如果相等则继续向后比较,谁大则需要跳到i+k+1或者j+k+1的位置,如果i和j相等,则开始新一轮的比较。

T94:求字符串的起始位置------字符串

代码实现:

#include <iostream>

#include <string>

using namespace std;

int main(){

string s,subs;

while(cin>>s>>subs){

int slen=s.length();

int subslen =subs.length();

int pos=0;//0 表示未找到

//如果子串长度大于主串

if(subslen<=slen){

//遍历可能的起始位置

for(int i=0;i<=slen-subslen;i++){

bool match=true;

for(int j=0;j<subslen;j++){

if(s[i+j]!=subs[j]){

match=false;

break;

}

}

if(match){

pos=i+1;//位置从1开始

break;

}

}

}

cout<<pos<<endl;

}

return 0;

}

个人思考:

这道题首先要记录下主串和子串的长度,然后暴力匹配,外层循环遍历主串:从0到主串和子串的长度之差,内层循环比较s[i+j]与subs[j]是否相同,如果都匹配则返回i+1,如果不匹配就跳出,默认没找到就是0。

英语翻译:

P66:III.理论与实践

计算机科学是理论、工程与实验的结合体。在某些情况下,计算机科学家先提出理论,然后基于该理论设计出一套软硬件结合的系统,并通过实验对其进行测试。这种以理论为驱动的方法的一个典型例子是:开发新的软件工程工具,随后在实际应用中对其进行评估。而在另一些情况下,实验也可能催生新的理论,例如:人们发现人工神经网络表现出与大脑中神经元类似的行为,这一发现进而推动了神经生理学领域新理论的诞生。

neurons:神经元(也叫神经细胞)

neurophysiology:神经生理学

P67:计算机的可预测性似乎会让实验变得没有必要,因为实验的结果理应可以提前预知。但当计算机系统及其与现实世界的交互变得足够复杂时,就可能产生不可预见的行为。因此,实验和传统的科学方法是计算机科学的关键组成部分。

nature:性质、特性

interactions:交互、相互作用

unforeseen:不可预见的、意料之外的

P68:IV.计算机科学的主要分支

计算机科学可划分为四个主要领域:软件开发、计算机体系结构(硬件)、人机交互(设计最高效的人机使用方式)以及人工智能(尝试让计算机表现出智能行为)。软件开发关注创建能高效运行的计算机程序。人工智能(AI)与人机交互领域通常需要同时开发软件和硬件,以解决特定问题。

architecture:计算机体系结构

interface:名词:接口 / 界面;动词:交互 / 对接

背单词:

相关推荐
hansang_IR1 小时前
【题解】类欧几里得算法
c++·数学·算法·类欧几里得
陈天伟教授1 小时前
人工智能应用- 人工智能交叉:06.解析蛋白质宇宙
人工智能·神经网络·算法·机器学习·推荐算法
We་ct2 小时前
LeetCode 114. 二叉树展开为链表:详细解题思路与 TS 实现
前端·数据结构·算法·leetcode·链表·typescript
像素猎人2 小时前
范围for语法(除for循环/while循环/do...while循环的第四种循环)
数据结构·算法
2 小时前
2.20进制转化,表达式求值,删除字符
开发语言·c++·算法
追随者永远是胜利者2 小时前
(LeetCode-Hot100)461. 汉明距离
java·算法·leetcode·职场和发展·go
郝学胜-神的一滴2 小时前
单例模式:从经典实现到Vibe Coding时代的思考
开发语言·c++·程序人生·单例模式·设计模式·多线程
努力学算法的蒟蒻2 小时前
day90(2.19)——leetcode面试经典150
算法·leetcode·面试
啊阿狸不会拉杆2 小时前
《计算机视觉:模型、学习和推理》第 5 章-正态分布
人工智能·python·学习·算法·机器学习·计算机视觉·正态分布