1531-奇怪的数字
思路:模拟即可
#include <iostream>
#include <vector>
#include <string>
int main()
{
int n = 1000000;
for (int i = 100;i <= n;i++) {
std::string s = std::to_string(i);
std::vector<int>mp(10, 0);
for (auto& ss : s) {
mp[ss - '0']++;
}
for (auto& ss : s) {
int num = ss - '0';
if (num == 0) continue;
std::vector<int>mp1 = mp;
if (i % num == 0) {
int nextNum = i / num;
//std::cout << i << " " << num << " " << nextNum << std::endl;
std::string st = std::to_string(nextNum);
mp1[num]--;
for (auto& sst : st) {
mp1[sst - '0']--;
}
}
bool is = false;
for (auto& m : mp1) {
if (m != 0) {
is = true;
break;
}
}
if (!is) {
printf("%d\n", i);
break;
}
}
}
return 0;
}
1542-数列
思路:模拟+哈希表
我们不难看出生成的数列如果遇到重复的,说明数列生成完成,将生成的所以数用哈希表存储,然后再遍历m寻找未存储的数
#include <stdio.h>
#include <string.h>
int main()
{
int n;
scanf("%d", &n);
while (n--) {
long long a, b, m, s = 0;
scanf("%lld%lld%lld", &a, &b, &m);
//哈希表
int mp[100001];
mp[0] = 1;
memset(mp, 0, sizeof(mp));
//遇到重复的就推出
while (!mp[(a * s + b) % m]) {
s = (a * s + b) % m;
mp[s] = 1;
}
//你也可以从1遍历到m
for (int i = 1;i <= 1e5 + 1;i++) {
if (!mp[i]) {
printf("%d\n", i);
break;
}
}
}
return 0;
}
1548-回文串
思路:你可以将每个地方数字插进去寻找规律。
例如[1,2,3,4,5],当你插入X到2后面的时候为[1,2,X,3,4,5]那么要求[X,3]是回文串[1,2......4,5]也得是回文串 例如[1,2,3,4,5],当你插入X到2后面的时候为 \\ [1,2,X,3,4,5]那么要求[X,3]是回文串\\ [1,2......4,5]也得是回文串例如[1,2,3,4,5],当你插入X到2后面的时候为[1,2,X,3,4,5]那么要求[X,3]是回文串[1,2......4,5]也得是回文串
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string s;
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//取消同步流
while (cin >> s) {
int n = s.size(), ans = 0;
if (n == 1) {
cout << 2 << '\n';
continue;
}
vector<vector<bool>>mp(n + 1, vector<bool>(n + 1, false));
bool isOk = true;
for(int i = n / 2;i <= n - 2;i++) {
mp[n - 2 - i][i] = (isOk && s[i] == s[n - 2 - i]);
isOk = mp[n - 2 - i][i];
}
isOk = true;
for (int i = n / 2; i >= 1;i--) {
mp[i][n - i] = (isOk && s[i] == s[n - i]);
isOk = mp[i][n - i];
}
if (!(n & 1)) mp[n / 2 - 1][n / 2 - 1] = true;
/*for (int i = 0;i <= n;i++) {
for (int j = 0;j <= n;j++) {
cout << i << " " << j << " " << mp[i][j] << " " << '\n';
}
}*/
for (int i = 0;i <= n / 2;i++) {
int l = i -

博客围绕多个算法题展开,如奇怪的数字、数列、回文串等。针对不同题目给出思路,涉及模拟、哈希表、二分、滑动窗口等方法,还提及C++ API的使用,部分题目因简单未给出代码,部分未完成,最后进行总结并给出鼓励话语。

1973

被折叠的 条评论
为什么被折叠?



