avatar-decorate
给个off吧要我做什么都行 level
获赞
264
粉丝
173
关注
12
看过 TA
4643
华中科技大学
2026
Java
IP属地:广东
暂未填写个人简介
私信
关注
第一题:n为奇数输出n个1,n为偶数输出n-1个0即可:#include <iostream>using namespace std;int main() {int t;cin >> t;while (t --) {int n;cin >> n;if (n & 1) {for (int i = 0; i < n; i ++) {cout << 1 << " ";}cout << '\n';} else {for (int i = 0; i < n - 1; i ++) {cout << 1 << " ";}cout << 0 << '\n';}}}第二题:如果你有n个长度相同的木棍,那么他们组成正m边形的组合是C(n,m)个,C是组合数,计下数就可以了。#include <bits/stdc++.h>using namespace std;#define int long longconst int p = 998244353;const int N = 5e3 + 10;int h[N], rh[N];int C(int n, int m) {if (n < m) return 0;return h[n] * rh[m] % p * rh[n - m] % p;}int qs(int a, int b) {int res = 1;while (b) {if (b & 1) res = res * a % p;a = a * a % p;b >>= 1;}return res;}signed main() {h[0] = rh[0] = 1;for (int i = 1; i < N ; i ++) {h[i] = h[i - 1] * i % p;rh[i] = qs(h[i], p - 2);}int n;cin >> n;map<int, int> mp;for (int i = 0; i < n; i ++) {int x;cin >> x;mp[x] ++;}for (int i = 3; i <= n; i ++) {int res = 0;for (auto& it : mp) {res = (res + C(it.second, i)) % p;}cout << res << ' ';}}3,最小生成树模板题,注意处理一下正边#include <cmath># include <iostream>#include <queue>using namespace std;const int N = 1e5 + 10;int p[N];int find(int x) {if (x != p[x]) p[x] = find(p[x]);return p[x];}int main() {int n, m;cin >> n >> m;priority_queue<pair<int, pair<int, int>>> pq;for (int i = 1; i <= n; i ++) p[i] = i;for (int i = 1 ; i <= m; i ++) {int u, v, x;cin >> u >> v >> x;pq.push({x, {u, v}});}long long res = 0;while (pq.size() > 0) {auto t = pq.top();pq.pop();int u = t.second.first;int v = t.second.second;int x = t.first;if (x >= 0) {res += x;p[find(u)] = find(v);} else if (find(u) != find(v)) {res += x;p[find(u)] = find(v);}}cout << res << '\n';
投递饿了么等公司10个岗位
0 点赞 评论 收藏
分享
中途加入只写了1,3,第二题没看懂要干啥第一题:优先队列 + 贪心可以想到贪心,先把所有的数给拆出来,比如[11, 299],拆成[9,9,2,1,1],然后贪心,把大的数放在位数高的那个元素就行了,比如例子中可以变成[(1,2), (2,3)]表示第一个数有两位,第二个数有三位,然后放入优先队列,首先取出第二个元素,将第三位变成9,现在第二个元素只剩两位了,继续放入优先队列,按照该顺序写就OK。代码如下:#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 10;int a[N] ,h[10];pair<int, int> b[N];int main() {int n;cin >> n;priority_queue<pair<int, int>> pq;for (int i = 0; i < n; i ++) {cin >> a[i];b[i].second = i;while (a[i]) {h[a[i] % 10] ++;a[i] /= 10;b[i].first ++;}pq.push(b[i]);}while(pq.size() > 0) {pair<int, int> t = pq.top();pq.pop();int num = 0;for (int i = 9; i >= 0; i --) {if (h[i] != 0) {h[i] --;num = i;break;}}a[t.second] = a[t.second] * 10 + num;t.first--;if (t.first !=0) {pq.push(t);}}long long res = 0;for (int i = 0; i < n; i ++) res += a[i];cout << res;}第三题:组合数首先要推公式,如果两个数a[i]和a[j]之间有n个0,设z = a[j] - a[i], 有多少种可能的序列,设为f(z, n),C是组合数。当n = 1 时,记为f(z, 1),很简单,该0可能是a[i] - a[j]之间的任何数,有z + 1 种可能,f(z, 1) = z + 1 = C(z+1, 1)。当n = 2 时,固定第一个0,如果第一个0为x,那么第二个0就和n = 1 时一样,此时枚举第一个0从[0-z],f(z, 2) = f(z,1) +f(z-1,1) + ...+f(1, 1) + f(0, 1) = 1 +... +z+1 = C(z+2, 2)。同理, n=3时,同理枚举第一个0。f(z, 3) = f(z, 2) +... f(0, 2) = C(z+2, 2) + C (z + 1, 2) + ... C(2, 2) = C(z+3, 3)可以看出来f(z, n) = C(z + n, n) = (z +n)!/(n! & z!);#include <bits/stdc++.h>using namespace std;#define int long longconst int p = 1e9 + 7;const int N = 6e5 + 10;int a[N];int mul[N], dmul[N];int qs(int a, int b) {int res = 1;while (b) {if (b&1) res = res * a % p;a = a * a % p;b >>= 1;}return res;}int C(int n, int m) {int cc = 1;for (int i = n - m + 1; i <= n; i ++) cc = cc * i %p;return cc * dmul[m] % p;}int lucas(int n, int m) {if (m == 0) return 0;int a = n % p, b = m % p;if (b > a) return 0;return C(a, b) * lucas(n/p, m /p) % p;}signed main() {int n; cin >> n;vector<int> v;int res = 1;mul[0] = dmul[0] = 1;for (int i = 1 ; i < N ; i ++) {mul[i] = mul[i - 1] * i % p;dmul[i] = qs(mul[i], p - 2);}for (int i = 1 ;i <= n; i ++) cin >> a[i];for (int i = 1 ; i < n; ) {if (a[i] == 0) {int j = i;while (a[j] == 0) j++;int d = a[j] - a[i - 1];int z = j - i;res = res * C(z + d, z) % p;i = j;} else i++;}cout << res << '\n';}
投递小红书等公司10个岗位
0 点赞 评论 收藏
分享
头像
04-15 15:59
已编辑
华中科技大学 Java
wxzf部门一面 3.12 1h 压力巨大的一轮八股:10分钟1,系统设计原则开闭原则这些,确实忘了2,封装继承多态实习:20min一直追问我的业务扩展性,难点一道题 30min实现一个斗地主,三名玩家。我写了一个game类,player类继承thread,game维护这三个线程的同步和互斥,准备写每个人一次出一张牌的逻辑,应该没有时间了。1,为什么要写多线程,又没有线程安全问题为什么要加锁答不出来好吧,我以为要写多线程,结果他要我设计这个系统,理解错题意了2,抢地主怎么设计3,如何设计出牌的模式,如果要新增牌型或者删除牌型如何改代码反问:面红温了,卡了一分钟没憋出来一句话,一面压力是真的大二面 3.18 一个小时 压力巨大的一轮先做一个算法题,把字符串变成回文串的最小串,写了个n方算法,后面跟面试官说可以用hash优化成O(n):15min实习:扩展到安全问题,一直追问安全问题,答不上来,温度upup八股:https反问:为什么这么注重安全问题(因为我简历没有安全相关东西所以问??)。什么时候出结果三面:3.21 一个小时 比较正常的面试上来四个面试官,还没开面已经吓死了实习深挖:四十分钟一些其他问题:1,如何看待ai的幻觉问题,之前做过大模型的实习扯了点解决方案2,wxg压力很大,你能承受吗?反问:直接跟我说我过了四面 面委:3.28 一个小时 压力巨大的一轮无自我介绍无反问,10min:问了些http和https常规问题1,浏览器输入url的过程2,https如何防止中间人,本地如何识别中间人剩下全是场景题:1,让你实现一个webserver你会如何实现主要从高并发(reactor/proactor),高可用(集群/负载均衡/限流熔断降级/set化),安全性(非对称加密/对称加密/加盐/报文完整性)几个方面来答2,webserver收到不完整的报文该如何处理首先分析了tcp/http协议组的处理方式。追问如果webserver出现了半包问题如何解决,答:类似http协议,在webserver收到请求时拦截校验完整性,不过面试官对答案不满意3,write如何实现,磁盘如何找到对应的位置答得不咋样,底层太拉了,不清楚磁盘如何找到对应位置的4,malloc/free如何申请内存,让你实现会如何实现首先答的是java那套没内存碎片的申请内存方式,但是忘记了cpp不会自动维护堆,实际上堆上会有很多碎片。然后答的是跳表维护内存碎片,同时需要维护并发安全问题。做到logn申请与logn释放。不过内存碎片如何合并没考虑好场景题:n个汽车种类,判断一段文章是否包含任意一种汽车类型。kmp的加强版,ac自动机模板题。当时答了分词后用用字典树匹配,不过面试官说分词时间复杂度太高。然后说了后缀树,后缀数组等后缀结构,好像后缀结构也没啥问题,面试官也没说不对😆4.7日 hr面 面完说一到两个工作日出结果4.8日 填完个人信息转评估录用,许愿oc更新4.14 offer
Sanctyzl:我超,这也太难了
0 点赞 评论 收藏
分享
头像
04-01 19:37
已编辑
华中科技大学 Java
3.17日 一面 :60min20min 问实习15min 算法:删除无效括号看我算法写的太轻松了,出了个多线程题。用信号量实现读写锁没写出来,晚上睡觉的时候想到,用读锁一次获得一个资源,写锁一次获取所资源上限的资源量。10min https深挖:追问我https为什么安全,到最后问我要是本地证书被攻破了怎么办本地攻破了那确实没办法了,没安装360是这样的反问:3.24 日 二面 70min20min 聊实习20min 八股1,kafka相关,kafka积压怎么解决2,介绍一下http3,sql优化相关4,一次sql理想的io次数30min 算法给了一堆用户访问信息,做一些统计,并统计出topk用户访问量cpp写代码工具都得自己搭建,写的有点慢了,最后findkth写的好像有问题,不过运行是对的,面试官也没看出来写的有问题,有点尴尬3.28日 三面 60min二十分钟问实习十分钟:设计一个单点限流,每个ip只限定100qps回答了zset对每个ip限流,但是造成zset过多的问题。redis本身的淘汰策略不可信,可以用时间分片zset优化,定时清理上一个时间片,如果时间片选的是10min那么这个窗口最多只有10分钟访问ip的zset。三十分钟:最大子数组乘积,并输出左右边界。反问:有没有转正名额。不方便透露hc,但是给我画饼优秀的同学不需要hc就可以留任。4.1日 hr面,面完oc
Lefty_:没安装360可还行
查看11道真题和解析
0 点赞 评论 收藏
分享
淘孝子:不知道他们在招谁。我其他厂都在不停面,阿里系全挂
0 点赞 评论 收藏
分享
0 点赞 评论 收藏
分享
头像
03-09 21:01
已编辑
华中科技大学 Java
1,模拟一下就好,别忘了处理换行和回车,代码略。2,bfs一下,找出每个点的坐标,o1输出就可以了。void bfs(int u) {queue q;q.push(u);pos[u] = {0, 0};mark[u] = 1;while (q.size() > 0) {int v = q.front();q.pop();int l = - 1, r = -1;for (auto x : g[v]) {if (mark[x]) continue;mark[x] = 1;q.push(x);if (l == -1) l = x;else {r = x;if (l > r) swap(l, r);}}if (l != -1) {pos[l] = pair(pos[v].x - 1, pos[v].y - 1);}if (r != -1) {pos[r] = pair(pos[v].x + 1, pos[v].y - 1);}}}3,可以发现,我们要计算的是每个数整除其他数之后的和。其实可以反过来想,我们要计算每个数作为除数,其他数除他之后的和。对于数i来说,[j * i, j * i + i - 1]这个范围内的数除以i等于j,那我们可以枚举每个i和每个j,维护一个前缀和来快速算出[j * i, j * i + i - 1]这个范围内的贡献,贡献数是i的数量 * 范围内数的个数 * j。时间复杂度是n + n/2 + n /3 +... = nlogn代码如下,cnt[i]是数字i的数量,sum[i]是前cnt[i]的前缀和,N是数的最大范围1e5;for (int i = 1; i < N; i ++) {if (cnt[i] == 0) continue;for (int j = 1; j * i < N; j ++) {res += 1ll * (sum[min(i * j + i - 1, N - 1)] - sum[i * j - 1]) * cnt[i] * j;}}
投递蚂蚁集团等公司10个岗位
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客网在线编程
牛客网题解
牛客企业服务