螞蟻暑期實(shí)習(xí)筆試
一共三道題,一道字符串,一道二分+前綴和,一道組合計數(shù)。
- 定義:
圓圈字符
: 26個小寫字母中里面有圈的字母。(a, b, d, e, g, o, p, q
)- 一個字符串中
圓圈字符
的個數(shù)大于非圓圈字符
的個數(shù),那么該字符串為圓圈字符串
- 問題:
- 輸入一個字符串,將字符串拆分為多個字串,求拆分后
圓圈字符串
最多有幾個。
Input:
abc
Output:
2
Code:
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int cnt = 0;
string ot = "abdegopq";
for (int i = 0; i < s.size(); i++) {
if (ot.find(s[i]) != string::npos) cnt++;
}
cout << cnt << endl;
return 0;
}
- 問題:輸入
和
,給一個長度為
的整數(shù)數(shù)組
,以及
個操作。
- 操作1,輸入一個1以及一個整數(shù)
,對所有的
進(jìn)行賦值操作:
- 操作2,輸入一個2,輸出數(shù)組
中所有元素的和。
- 輸入包含
組。
Input:
1
5 3
1 3 5 4 2
2
1 2
2
Output:
15
9
Code:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
#define LL long long
int n, q, a[N];
LL s[N];
int main() {
int T;
scanf("%d", &T);
while (T -- ) {
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i ++) {
scanf("%d", &a[i]);
s[i] = s[i - 1] + a[i];
}
sort(a + 1, a + n + 1);
LL ans = s[n];
int R = n;
while (q --) {
int op;
scanf("%d", &op);
if (op == 2) printf("%lld\n", ans);
else {
int v;
scanf("%d", &v);
int l = 1, r = R, f = -1;
while (l <= r) {
int mid = (l + r) >> 1;
if (a[mid] >= v) {
f = mid;
r = mid - 1;
}
else l = mid + 1;
}
if (f == -1) continue;
else {
R = f;
a[f] = v;
ans = s[f - 1] + (LL) a[f] * (n - f + 1);
}
}
}
}
return 0;
}
- 定義:一個整數(shù)
,例如
,那么對
每一位進(jìn)行排列組合可以得到
,但這個數(shù)本身不應(yīng)該被包含在內(nèi)。因此最終的集合為
。
- 問題:這個集合中,數(shù)位上所有數(shù)字的和為素數(shù)的元素個數(shù)。
- 輸入
個整數(shù),每個整數(shù)
- 不考慮前導(dǎo)0
Input:
4
100
123
101
236
Output:
0
0
2
5
Code:
#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
scanf("%d", &T);
while (T -- ) {
char x[12];
scanf("%s", x + 1);
int sum = 0, n = strlen(x + 1), cnt[12] = {0};
for (int i = 1; i <= n; i ++ ) {
int t = x[i] - '0';
sum += t;
cnt[t] ++;
}
bool f = true;
for (int i = 2; i * i <= sum; ++ i) {
if (sum % i == 0) {
f = false; break;
}
}
if (sum == 1) f = false;
if (!f) {
puts("0"); continue;
}
auto A = [&](int x) -> int {
int res = 1;
for (int i = 2; i <= x; ++i) res *= i;
return res;
};
int ans = A(n);
for (int i = 0; i <= 9; ++ i) {
ans /= A(cnt[i]);
}
printf("%d\n", --ans);
}
return 0;
}
#螞蟻實(shí)習(xí)筆試#