文章目錄
- 第一題
- 題目
- 思路
- 代碼
- 第二題
- 題目:
- 思路
- 代碼
- 第三題
- 題目:
- 思路
- 代碼
- 優化(滑動窗口)
第一題
題目
字符串替換
思路
模擬
- 當遍歷到正常字符時,直接加入結果答案;
- 當遍歷到占位符時,按順序使用
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;
}