2022腾讯2022实习生笔试ak(4月24日后台&综合)
写了一小时多一点,为什么要有核心模式这种调试难度拉满的写法。。。
没昨天雷火的笔试难写,ABC签到D好好读题E DP
A:签到
B:先筛个素数,然后根据a的下标pop_back弹到只剩一个即可
int n = a.size();
vector<int>v(n+1);//素数0非素数1
v[1]=1;
for(int i=2;i<=n;i++)
if(!v[i]){
for(int j=2;i*j<=n;j++)
v[i*j]=1;
}
vector<int>tmp;
while(a.size() > 1){
while(!a.empty()){
if(!v[a.size()])
tmp.push_back(a.back());
a.pop_back();
}
while(!tmp.empty()){
a.push(tmp.back());
tmp.pop_back();
}
}
C:前缀和
D:把所有给的表遍历一遍,以map<int,int>nex记录每个数下一个数是多少(数据所有数都不相同)就可以把环形链表还原出来了,然后以最小的数为起点正着跑一遍倒着跑一遍取字典序最小
class Solution {
public:
map<int, int>nex;
ListNode* makeList(vector<int>& a) {
ListNode* head = NULL;
ListNode* now = new ListNode(a[0]);
head = now;
for (int i = 1; i < a.size(); i++) {
ListNode* tmp = new ListNode(a[i]);
now->next = tmp;
now = tmp;
}
return head;
}
ListNode* solve(vector<ListNode*>& a) {
// write code here
int MIN = 1e9 + 10;
for (auto i : a) {
int last = -1;
while (i != NULL) {
if (last != -1)
nex[last] = i->val;
MIN = min(i->val, MIN);
last = i->val;
i = i->next;
}
}
vector<int>res;
res.push_back(MIN);
int now = MIN;
while (nex[now] != MIN) {
now = nex[now];
res.push_back(now);
}
vector<int>ans;
ans.push_back(res[0]);
for (int i = res.size() - 1; i > 0; i--)
ans.push_back(res[i]);
int ok = 0;
for (int i = 1; i < res.size(); i++) {
if (res[i] < ans[i])
break;
else if (res[i] > ans[i]) {
ok = 1;
break;
}
}
return (ok == 0 ? makeList(res) : makeList(ans));
}
};
E:\(dp_i\)表示手上有i只股票最多能剩多少钱(手上,不是总资产),初始化dp[0]=m(一开始没买股票,手上有m块),\(n^2\)转移取max,最后算一下总资产,题意是:
\(最终总资产 = 最后手上的钱+手上的股票数*最后一天的股价\)
没了