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.没看

