A. 题目:
小红拿到了一个字符串,她发现这个字符串可能是她自己的名字 "kou" ,于是想将其替换成小紫的名字 "yukari" 。你能帮帮她吗?
输入描述:
一个仅由小写英文字母字符串str,长度不超过 10。
输出描述:
如果这个字符串是"kou",请替换成小紫的名字。否则按原串输出。
题目很简单,只要是输入字符串的等于 “kou” 就好啦,直接上代码
#include<bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
if (s == "kou") {
cout << "yukari" << endl;
} else {
cout << s << endl;
}
}
B. 题目:
小红拿到了一个正整数 x ,她想知道 x 有多少个不同的素因子,你能帮帮她吗?
输入描述:
一个正整数 x 。1 ≤ x ≤ 10 ^ 13
输出描述:
x不同的素因子的数量。
关键代码:
进入一个循环,初始值为 i = 2
,循环条件为 i * i <= x
。该循环用于找出 x
的所有质因数。在循环中,首先判断 x
是否能被 i
整除,即 x % i == 0
。如果成立,说明 i
是 x
的一个质因数。使用一个内部循环,通过不断除以 i
来将所有连续相等的质因数除掉。这样可以保证统计质因数个数时不重复计算。内部循环结束后,将 res
加 1,表示找到了一个质因数。
for (long long i = 2; i * i <= x; i++) {
if (x % i == 0) {
while (x % i == 0) {
x /= i;
}
res++;
}
}
最后是 AC 代码(标注版本):
#include<bits/stdc++.h> // 包含整个标准库,这行代码可以省略
using namespace std; // 使用标准命名空间
typedef long long ll; // 定义别名 ll 为 long long
int main() {
ll x; // 定义变量 x,类型为 long long
cin >> x; // 从标准输入读入一个整数并赋值给 x
ll res = 0; // 定义变量 res,并初始化为 0
for (ll i = 2; i * i <= x; i++) { // 循环变量 i 从 2 开始,直到 i * i 大于等于 x
if (x % i == 0) { // 如果 x 能被 i 整除
while (x % i == 0) { // 循环除去 x 中的所有 i 因子
x /= i; // 除去一个 i 因子
}
res++; // 记录一个不同的素因子
}
}
if (x > 1) { // 如果 x 大于 1,说明还存在一个不同的素因子
res++;
}
cout << res << endl; // 输出结果
return 0; // 程序结束,返回 0 表示正常退出
}
C. 题目:
小红定义一个长度为奇数的字符串的“中值”为中间那个字符。例如 "kou" 的中值是 'o' 。
现在小红拿到了一个字符串,她想知道某个字符是多少个子串的中值。你能帮帮她吗?
输入描述:
1. 第一行输入一个正整数n和一个英文小写字符 chr 。代表字符串长度和询问的字符。
2. 第二行输入一个长度为 n 的、仅由小写字母组成的字符串。
3. 1 ≤ n ≤ 10^5
输出描述:
一个整数,代表中值为 chr 的连续字串数量
输入样例:
4 b
abcb
输出样例:
3
这道题的思路是遍历字符串,并记录与给定字符相同的字符出现的位置,然后根据这些位置计算连续子串的数量。
首先,在 main
函数中声明了变量 n
和 ans
,分别用于存储字符串 s
的长度和最终的结果值。还声明了变量 left
和 right
,用于记录当前操作字符的左侧和右侧的字符个数。还声明了变量 k
用于存储目标字符。然后,从输入流中读入变量 n
和 k
。接着从输入流中读入字符串 s
。因为最大值可能是 10 ^ 5,所以需要使用 long long。
long long n, ans = 0, left = 0, right = 0;
char k;
string s;
接下来,使用一个循环遍历字符串 s
的每个字符。如果当前字符与 k
不相等,将 left
加 1,表示当前字符的左侧字符个数增加 1。否则,表示当前字符与 k
相等,进行一次操作,将 left
加 1,将 ans
加 1,同时计算出当前字符右侧的字符个数 right
。根据题意,我们需要选择操作次数较少的一侧继续操作,所以我们将操作次数较少的一侧的字符个数 res
赋给 ans
,同时将 ans
加上 res
。
for (int i = 0; i < s.length(); i++) {
if (s[i] != k) {
left++;
} else {
int res;
left++;
ans++;
right = s.length() - left;
if (left - 1 > right) {
res = right;
} else {
res = left - 1;
}
ans = ans + res;
}
}
这段代码的时间复杂度是 O(n),其中 n 是字符串 s
的长度。因为循环遍历了字符串 s
,所以时间复杂度与字符串长度成正比。
最后附上 AC 代码(外加标注)
#include <bits/stdc++.h>
using namespace std;
int main() {
// 声明变量
long long n, ans = 0, left = 0, right = 0;
char k;
string s;
// 读取输入
cin >> n >> k; // 输入字符串长度和目标字符
cin >> s; // 输入字符串
// 遍历字符串
for (int i = 0; i < s.length(); i++) {
if (s[i] != k) {
left++; // 当前字符不是目标字符,左侧字符个数加一
} else {
int res;
left++; // 当前字符是目标字符,左侧字符个数加一
ans++; // 操作次数加一
right = s.length() - left; // 计算右侧字符个数
// 选择操作次数较少的一侧并计算结果
if (left - 1 > right) {
res = right;
} else {
res = left - 1;
}
ans = ans + res; // 更新最终结果
}
}
// 输出结果
cout << ans << endl;
return 0;
}