2022.04.24 腾讯后台开发笔试&部分题解
1.竖着输出数字。
2.删除数组中下标非素数的数。
3.最大攻击和防守的差值。
4.循环链表链表序最小。
5.没看
1.竖着输出数字。
直接模拟。
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<string>s(n); for(int i = 0; i < n; i++) cin >> s[i]; vector<string>ans; for(int i = 0; i < s[0].size(); i++) { string t; for(int j = 0; j < n; j++) { t.push_back(s[j][i]); } string t2; int j = 0; while(j < t.size() && t[j] == '0') j++; if(j == t.size()) ans.emplace_back("0"); else { t = t.substr(j, t.size() - j + 1); ans.emplace_back(t); } } sort(ans.begin(), ans.end(), [&](const string &x, const string &y) { if(x.size() == y.size()) return x < y; return x.size() < y.size(); }); for(int i = 0; i < ans.size(); i++) { cout << ans[i]; if(i == ans.size() - 1) cout << '\n'; else cout << ' '; } return 0; }
2.删除数组中下标非素数的数。
打表。
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param a int整型vector * @return int整型 */ int getNumber(vector<int>& a) { int n = a.size(); if(n <= 3) return a[n - 1]; if(n == 4) return a[2]; if(n <= 10) return a[4]; if(n <= 30) return a[10]; if(n <= 126) return a[30]; if(n <= 708) return a[126]; if(n <= 5380) return a[708]; if(n <= 52710) return a[5380]; return a[52710]; } };
3.最大攻击和防守的差值。
前后遍历。
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; string s; cin >> s; long long a = 0, b = 0; for(int i = 0; i < n; i++) { if(s[i] == '1') { b += i + 1; } } long long ans = LLONG_MAX; for(int i = 0; i < n; i++) { ans = min(ans, abs(a - b)); if(s[i] == '0') { a += i + 1; } else { b -= i + 1; } } ans = min(ans, abs(a - b)); cout << ans << endl; return 0; }
4.循环链表链表序最小。
模拟。(把一个大于小于号写反了,浪费半小时,最后几分钟发现了,过了90%。。数组越界,没时间改了)
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param a ListNode类vector 指向每段碎片的开头 * @return ListNode类 */ ListNode *solve(vector<ListNode *> &a) { unordered_map<int, ListNode *>mp; unordered_map<int, bool>vis; for(int i = 1; i < a.size(); i++) { mp[a[i]->val] = a[i]; } vector<ListNode *>v; int minIndex = 0; ListNode *cur = a[0]; while(cur) { v.push_back(cur); if(v[minIndex]->val > v.back()->val) { minIndex = v.size() - 1; } if(mp[cur->val] != nullptr) { auto t = mp[cur->val]; mp[cur->val] = nullptr; cur = t; } vis[cur->val] = true; cur = cur->next; if(vis[cur->val]) break; } int nextIndex = minIndex + 1; int preIndex = minIndex - 1; if(nextIndex == v.size()) nextIndex = 0; if(preIndex == -1) preIndex = v.size() - 1; int step = 1; if(v[preIndex]->val < v[nextIndex]->val) step = -1; int curIndex = minIndex; int count = v.size() - 1; while(count--) { int nextIndex = curIndex + step; if(nextIndex == v.size()) nextIndex = 0; else if(nextIndex == -1) nextIndex = v.size() - 1; v[curIndex]->next = v[nextIndex]; curIndex = nextIndex; } v[curIndex]->next = nullptr; return v[minIndex]; } };
5.没看