文章目录
- 第一题
- 题目
- 思路
- 代码
- 第二题
- 题目:
- 思路
- 代码
- 第三题
- 题目:
- 思路
- 代码
- 优化(滑动窗口)
第一题
题目
字符串替换
思路
模拟
- 当遍历到正常字符时,直接加入结果答案;
- 当遍历到占位符时,按顺序使用
arg
中的替换; - 检查
arg
中的字符是否使用完,没有使用完的话,在结果后面依次加上;
代码
第二题
题目:
神奇数
思路
模拟
- 遍历
[a, b]
中的所有数,检查是否为神奇数,如果为神奇数,则答案加一; - 对于每一个数,取出他每一位的数,用两重循环拼出所有的数,检查该数是否为质数;
代码
第三题
题目:
DNA序列
思路
暴力枚举
- 搞两个指针
i和j
长度为n
指向s
的两端,统计中间有多少个C和G
,取出最大且最先出现的结果;
代码
优化(滑动窗口)
原因: j
指针每次可以不从i
位置枚举,可以从当前位置继续向后走;
代码
// https://www.nowcoder.com/practice/e8480ed7501640709354db1cc4ffd42a?tpId=37&tqId=21286&ru=/exam/oj#include <iostream>
#include <string>using namespace std;// int main()
// {
// string s;
// int n;
// cin >> s >> n;// int max_count = 0;
// string result = s.substr(0, n);// for (int i = 0; i <= s.size() - n; ++i)
// {
// int count = 0;
// for (int j = i; j < i + n; ++j)
// {
// if (s[j] == 'G' || s[j] == 'C')
// {
// count++;
// }
// }
// if (count > max_count)
// {
// max_count = count;
// result = s.substr(i, n);
// }
// }// cout << result << endl;
// return 0;
// }int main()
{string s;int n;cin >> s >> n;int left = 0, right = 0;int count = 0;int max_count = 0;int begin = -1;while(right < s.size()){if(s[right] == 'G' || s[right] == 'C'){count++;}while(right - left + 1 > n){if(s[left] == 'G' || s[left] == 'C'){count--;}left++;}if(right - left + 1 == n){if(count > max_count){max_count = count;begin = left;}}right++;}return 0;
}