1.字符串替换
代码:
#define _CRT_SECURE_NO_WARNINGS 1 class Solution { public: string formatString(string str, vector<char>& arg) { string ans = ""; int pos = 0; for (int i = 0; i < str.size(); i++) { if (i != str.size() - 1 && str[i] == '%' && str[i + 1] == 's') { ans += arg[pos++]; i++; } else { ans += str[i]; } } // cout<<ans<<endl; while (pos < arg.size()) { ans += arg[pos++]; } return ans; } };
2.神奇数
思路:
暴力呗。枚举区间的每一个数字,并枚举这个数字的每俩个数位的组合,并判断是不是质数就OK了。时间复杂度为1e5*25*log(100),大概就是在1e7的级别。也可以用一个质数筛提前把100以内的质数筛出来,时间复杂度就在1e6的级别。都差不多。
代码:
#include <iostream> #include<vector> using namespace std; const int N = 110; int prim[N]; int st[N]; int cnt = 0; void getprim() { st[1] = true; for (int i = 2; i < N; i++) { if (!st[i])prim[cnt++] = i; for (int j = 0; i < N / prim[j]; j++) { st[prim[j] * i] = true; if (i % prim[j] == 0)break; } } } int main() { int a, b; cin >> a >> b; int ans = 0; getprim(); for (int i = a; i <= b; i++) { vector<int> res; int k = i; while (k) { res.push_back(k % 10); k /= 10; } int f = 0; for (int j = 0; j < res.size(); j++) { if (f == 1)break; for (int k = 0; k < res.size(); k++) { if (j == k || res[j] == 0)continue; if (!st[res[j] * 10 + res[k]]) { f = 1; break; } } } if (f == 1) { // cout<<i<<endl; ans++; } } cout << ans << endl; }
3.DNA序列
又是一个题意都说不明白的题。最小子序列长度,到底是子串还是子序列啊。既然是定值为啥还要说最小啊,服了。
这题就不用算比例,因为长度是固定的,直接比较cg数量就好了.
#include <iostream> #include<string> #include<algorithm> using namespace std; const int N = 1100; int c[N]; int g[N]; int main() { string str; int ll; cin >> str >> ll; str.insert(str.begin(), '0'); int n = str.size(); for (int i = 1; i <= n; i++) { c[i] = c[i - 1] + (str[i] == 'C' ? 1 : 0); g[i] = g[i - 1] + (str[i] == 'G' ? 1 : 0); } string ans = ""; int res = 0; int len = ll; for (int l = 1; l + len - 1 <= n; l++) { int r = l + len - 1; int s = c[r] - c[l - 1] + g[r] - g[l - 1]; if (res < s) { ans = str.substr(l, len); res = s; } } cout << ans << endl; return 0; }