「笔试练习」2021 拼多多笔试题目
提前感受一下笔试难度~
A
https://www.nowcoder.com/questionTerminal/3d6b53e097ea41bda049d111f30db28e
和最大为 45,大于 45 直接输出 -1。
然后优先位数更少,所以竟可能的放更大的数字,例如 9,8,7这些。
而更大的数字优先往后面放,所以就有了如下做法:
#include <iostream> #include <string> #include <algorithm> using namespace std; int main() { int n; cin >> n; if (n > 45) { cout << -1 << "\n"; return 0; } string res = ""; for (int i = 9; i >= 1; i--) { if (n > i) { res += '0' + i; n -= i; } else { res += '0' + n; break; } } reverse(res.begin(), res.end()); cout << res << endl; }
B
https://www.nowcoder.com/questionTerminal/78255f37c7dc4f749ceafc8c58206a43
两个字符串相同的部分不需要消费代价。而不同的部分,要贪心的去匹配修改。
例如 a 中的 f, z 要替换到 b 中的 g,h。那么我们的做法是 f->g, z->h。即排序后更近的去匹配。
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; string s, t; cin >> s >> t; sort(s.begin(), s.end()); sort(t.begin(), t.end()); int res = 0; for (int i = 0; i < s.size(); i++) { res += abs(s[i] - t[i]); } cout << res << "\n"; return 0; }
C
https://www.nowcoder.com/questionTerminal/877c520f935c4d67a4614dc4bce84a1a
维护一个前缀和模 M 的结果,如果两个前缀模 M 的结果相同,则它们中间的子数组模 M 是 0,是和谐的。
因此,用哈希维护每一个前缀和的数量即可,过程中直接做统计。
#include <bits/stdc++.h> using namespace std; int main() { int n, m, pre = 0; cin >> n >> m; vector<int> a(n); unordered_map<int, int> mp; mp[0] = 1; long long res = 0; for (int i = 0; i < n; i++) { cin >> a[i]; pre = (pre + a[i]) % m; res += mp[pre]; mp[pre]++; } cout << res << endl; return 0; }
D
https://www.nowcoder.com/questionTerminal/27086d759f01413b94a1a30a53e4a333
枚举,因为骰子只有 4 种旋转方法,所以每获得一个新的骰子,就 BFS 一下,把所有可能都遍历到(最多可能 24 种?),然后后面如果在遇到一样的,就可以直接判断它属于哪一种了。
记录每一种的数量,最后输出答案即可。
#include <bits/stdc++.h> #include <cstdio> #include <functional> #include <tuple> #include <unordered_map> #include <vector> using namespace std; struct sieve{ int up, down, left, right, front, back; string to_string() { static char t[15]; // cout << up << ' ' << down << ' ' << left << ' ' << right << ' ' << front << ' ' << back << endl; sprintf(t, "%d%d%d%d%d%d", up, down, left, right, front, back); return string(t); } }; sieve toUp(sieve s) { tie(s.front, s.down, s.back, s.up) = make_tuple(s.down, s.back, s.up, s.front); return s; } sieve toDown(sieve s) { tie(s.front, s.down, s.back, s.up) = make_tuple(s.up, s.front, s.down, s.back); return s; } sieve toLeft(sieve s) { tie(s.front, s.right, s.back, s.left) = make_tuple(s.right, s.back, s.left, s.front); return s; } sieve toRight(sieve s) { tie(s.front, s.right, s.back, s.left) = make_tuple(s.left, s.front, s.right, s.back); return s; } int main() { int n; cin >> n; // 筛子序列化 -> 种类编号 unordered_map<string, int> mp; vector<int> cnt(n); for (int i = 0; i < n; i++) { sieve s; cin >> s.up >> s.down >> s.left >> s.right >> s.front >> s.back; // cout << s.to_string() << endl; if (mp.count(s.to_string())) { cnt[mp[s.to_string()]]++; continue; } // 种类命名为 i cnt[i]++; queue<sieve> q; q.push(s); // cout << "s: " << s.to_string() << endl; while (q.size()) { auto x = q.front(); q.pop(); // cout << x.to_string() << endl; for (auto &y : vector<sieve>{toUp(x), toDown(x), toLeft(x), toDown(x)}) { if (mp.count(y.to_string())) continue; mp[y.to_string()] = i; q.push(y); } } } vector<int> res; for (int i = 0; i < n; i++) { if (cnt[i] > 0) res.push_back(cnt[i]); } sort(res.begin(), res.end(), greater<int>()); cout << res.size() << endl; for (auto x : res) { cout << x << " "; } }#笔试#
记录2023年-2024年的笔试、面试问题~