阿里研发岗0407编程题题解
这场考试感觉码量比较大,做完选择题,还剩一个小时出头,还以为写不完。
最后还剩5分钟写完了,挺刺激的。。。
进制转换
写个函数,对p进制处理一下
如果p进制不行,就是字符串中有个字符大于等于p,就返回-1
wa了几发,发现题目还有相同结果,保留一个
吐了
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int mod = 7 + 1e9;
string s;
vector<int> a;
vector<int> b;
int calc(int p) {
LL ans = 0;
for (auto &i : a) {
if (i >= p) return -1;
ans = ans * p + i;
ans %= mod;
}
return ans;
}
int main() {
cin >> s;
auto f = [](char v) {
if (isdigit(v)) return v - '0';
return v - 'A' + 10;
};
for (auto & i : s) {
a.push_back(f(i));
}
for (int i = 2; i <= 16; ++i) {
int val = calc(i);
if (val < 0) continue;
b.push_back(val);
}
sort(b.begin(), b.end());
b.erase(unique(b.begin(), b.end()), b.end());
for (auto &i : b) cout << i << endl;
return 0;
} 小红的账单
读到题,发现要自己处理数字,什么毒瘤出题人
发现带冒号的字符串,都是冒号左边是没啥用的字符串,右边是小数
写成一个函数,先找到冒号这个分界,再用substr和atof(字符串转double)处理一下就好了
#include <bits/stdc++.h>
using namespace std;
using PII = pair<int, int>;
const int N = 503;
string month[] = {"", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
pair<string, double> get() {
string s;
cin >> s;
int p = 0;
while (s[p] != ':')
++p;
return {s.substr(0, p), atof(s.substr(p + 1).c_str())};
}
int main() {
double a = 1e9, b = -1e9;
int pa = 0, pb = 0;
for (int i = 1; i <= 12; ++i) {
auto g = get();
// cout << "*** " << g.first << ' ' << g.second << endl;
double in = 0, out = 0;
for (int j = 1; j <= g.second; ++j) {
auto c = get();
// cout << "*** **" << c.first << ' ' << c.second << endl;
if (c.second > 0)
in += c.second;
else
out += c.second;
}
if (a > out) {
a = out;
pa = i;
}
if (b < in) {
b = in;
pb = i;
}
printf("%s:%s%.2f\n", month[i].c_str(), in + out >= 0 ? "+" : "", in + out);
}
cout << month[pa] << ' ' << month[pb] << endl;
return 0;
} 小红的子串删除
(感觉双指针出烂了,但是他这是删除,又绕了几下,调了好久...)
枚举左端点
找到不合法的右端点
now表示删除这个区间后,字符的种类
当挪到
时,
(这个
和前面那个不太一样)就是合法的区间
所以ans加上
因为边界问题,右端点也可能合法,需要特判
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 3 + 2e5;
int n, k;
char s[N];
int cnt[26], now;
int main() {
cin >> n >> k;
cin >> s + 1;
// 这个循环结束后,now就是整个字符串的字符种类数
for (int i = 1; i <= n; ++i) {
now += !cnt[s[i] - 'a']++;
}
LL ans = 0;
for (int i = 1, j = 1; j <= n; ++j) {
while (i <= n && now >= k) {
now -= !--cnt[s[i] - 'a'];
++i;
}
ans += i - j - 1;
if (now >= k) ++ans; // 特判
now += !cnt[s[j] - 'a']++;
}
cout << ans << endl;
return 0;
} #阿里巴巴##笔试题目##笔经#
