前端开发工程师笔试算法【笔试-算法】2026年字节跳动工程训练营笔试算法题
寻觅~流光第一题 - 病毒杀灭
题意:初始1个病毒,第i天增加i²个。武器能杀k个。求不超过k的最大累积病毒数。
思路:模拟累加平方数,直到超过k。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include <iostream> using namespace std;
int main() { int t; cin >> t;
while (t--) { long long k; cin >> k;
long long ans = 0; long long i = 1;
while (ans + i * i < k) { ans += i * i; i++; }
cout << ans << endl; }
return 0; }
|
第二题 - 数组分块
题意:数组分为块,格式:k个1×1块 + (k-1)个2×1块 + … + 1个k×1块。输入n,输出k。
图示:
思路:求 $\sum_{i=1}^{k}i(k+1-i) = n$
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <iostream> using namespace std;
int main() { long long n; cin >> n; long long left = 1, right = 1000000; while (left < right) { long long mid = (left + right) / 2; long long val = mid * (mid + 1) * (mid + 2) / 6; if (val < n) left = mid + 1; else right = mid; } cout << left << endl; return 0; }
|
第三题 - 区间操作
题意:长度a的零数组,进行b次操作。每次操作(l,r,n):在[l,r]内,找所有下标被n整除的位置,对应值+1。
思路:直接遍历[l,r],对于每个位置判断是否被n整除。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include <iostream> #include <vector> using namespace std;
int main() { int a, b; cin >> a >> b; vector<int> arr(a + 1, 0); for (int i = 0; i < b; i++) { int l, r, n; cin >> l >> r >> n; for (int j = l; j <= r; j++) { if (j % n == 0) { arr[j]++; } } } for (int i = 1; i <= a; i++) { cout << arr[i]; if (i < a) cout << " "; } cout << endl; return 0; }
|