AI Coding
日常逛脉脉,发现了一篇神贴。
一位网友在字节同事圈发文,表示自己遇到了新卷王,周五下午才刚评完了 PRD,结果周一上午就发了上线单。

这背后的原因,还是因为 AI 提效。
自从有了 AI Coding,卷王基本上 24 小时就有产出,而且现在领导们也默认了大家都在使用 AI Coding,原来一周排期的工作,现在基本上在第二第三天就来问能不能上线了。
这位网友还表示,自己作为传统程序员,目前还无法完全信任 AI 产出,觉得还是需要花费很多精力去做 review,表示无法破局。
首先,这困境肯定是存在的,而且是普遍的。
现在的 AI Coding 发展很快,我觉得 24 小时内有产出,都属于偏保守了,基本上 PRD 一喂,80% 以上的工作,都能在 3~4 小时内完成,DDD(规范驱动设计)做得好的,甚至是 90% 的工作都能一次性完成。
但网友可不会给你认真分析,还有不怕事大的,半带调侃得说到:这还卷,应该周五晚就上线 🤣🤣

一些更加"现实"的网友则表示,代码能跑就行,管它是不是 AI 生成:

而且大厂目前的普遍做法,即使是单一模块,也时有多人开发,多人维护,万一哪天真的出现了问题,也不太会追溯具体的提交者,而是由当天的 oncall 人员去负责。

这就导致确实是一个困境,总有人为了绩效(产出),而无视长期质量,但最终的长期质量是由所有人来埋单。
这就导致了一个很现实的问题:要么加入,要么被淘汰。

对此,你怎么看?欢迎评论区交流。
...
回归主题,来一道和「字节跳动」相关的算法题。
题目描述
平台:LeetCode
题号:1802
给你三个正整数 n、index 和 maxSum。
你需要构造一个同时满足下述所有条件的数组 nums(下标 从 0 开始 计数):
nums.length == nnums[i]是 正整数 ,其中0 <= i < nabs(nums[i] - nums[i+1]) <= 1,其中0 <= i < n-1nums中所有元素之和不超过maxSumnums[index]的值被 最大化返回你所构造的数组中的 nums[index]
注意:abs(x) 等于 x 的前提是 x >= 0;否则,abs(x) 等于 -x。
示例 1:
输入:n = 4, index = 2, maxSum = 6输出:2解释:数组 [1,1,2,1] 和 [1,2,2,1] 满足所有条件。不存在其他在指定下标处具有更大值的有效数组。示例 2:
输入:n = 6, index = 1, maxSum = 10输出:3提示:
二分 + 贪心 + 数学
根据题意,容易想到以 ans 为分割点的正整数数组具有二段性,其中 ans 为最大的 。
小于等于 ans 的值均能通过直接调整 来构造,不会违反总和不超过 max 的限制;大于 ans 的值则无法满足 max 限制。基于此我们可通过「二分」的方式来找分割点。
假设当前二分到的值为 x,考虑如何实现一个 check 函数,该函数用于判断 x 能否作为 :
为了令 时,数组总和 sum 不超过 max 限制,我们应当贪心构造 的剩余元素:从 开始往两侧构造,按照递减的方式进行逐个构造,若递减到 则维持不变。
这样可确保构造出来的 既满足 同时元素总和最小。

位置 idx 的值为 x,其左边有 idx 个元素,其右边有 n - idx - 1 个元素。
利用「等差数列求和」公式分别从 x - 1 开始构造(注意:这里说的构造仅是计算 总和),若总和不超过 max 说明 满足要求,我们令 ,否则令 。
Java 代码:
classSolution{publicintmaxValue(int n, int index, int max){long l = 1, r = max;while (l < r) {long mid = l + r + 1 >> 1;if (check(n, mid, index, max)) l = mid;else r = mid - 1; }return (int) r; }booleancheck(int n, long x, int idx, int max){long sum = x;if (idx > x - 1) {long an = x - 1, a1 = 1, cnt = x - 1; sum += cnt * (a1 + an) / 2; sum += idx - cnt; } else {long cnt = idx, an = x - 1, a1 = an - cnt + 1; sum += cnt * (a1 + an) / 2; }if (n - idx - 1 > x - 1) {long an = x - 1, a1 = 1, cnt = x - 1; sum += cnt * (a1 + an) / 2; sum += n - idx - 1 - cnt; } else {long cnt = n - idx - 1, an = x - 1, a1 = an - cnt + 1; sum += cnt * (a1 + an) / 2; }return sum <= max; }}C++ 代码:
classSolution {public:intmaxValue(int n, int index, int maxSum){long l = 1, r = maxSum;while (l < r) {long mid = (l + r + 1) >> 1;if (check(n, mid, index, maxSum)) l = mid;else r = mid - 1; }return (int) r; }boolcheck(int n, long x, int idx, int maxSum){long sum = x;if (idx > x - 1) {long an = x - 1, a1 = 1, cnt = x - 1; sum += cnt * (a1 + an) / 2; sum += idx - cnt; } else {long cnt = idx, an = x - 1, a1 = an - cnt + 1; sum += cnt * (a1 + an) / 2; }if (n - idx - 1 > x - 1) {long an = x - 1, a1 = 1, cnt = x - 1; sum += cnt * (a1 + an) / 2; sum += n - idx - 1 - cnt; } else {long cnt = n - idx - 1, an = x - 1, a1 = an - cnt + 1; sum += cnt * (a1 + an) / 2; }return sum <= maxSum; }};Python 代码:
classSolution:defmaxValue(self, n: int, index: int, maxSum: int) -> int: l, r = 1, maxSumwhile l < r: mid = (l + r + 1) >> 1if self.check(n, mid, index, maxSum): l = midelse: r = mid - 1return int(r)defcheck(self, n, x, idx, maxSum): sumv = xif idx > x - 1: an, a1, cnt = x - 1, 1, x - 1 sumv += cnt * (a1 + an) // 2 sumv += idx - cntelse: cnt, an, a1 = idx, x - 1, x - idx sumv += cnt * (a1 + an) // 2if n - idx - 1 > x - 1: an, a1, cnt = x - 1, 1, x - 1 sumv += cnt * (a1 + an) // 2 sumv += n - idx - 1 - cntelse: cnt, an, a1 = n - idx - 1, x - 1, x - n + idx + 1 sumv += cnt * (a1 + an) // 2return sumv <= maxSumTypeScript 代码:
functionmaxValue(n: number, index: number, maxSum: number): number{const check = function(n: number, x: number, idx: number, maxSum: number): boolean{let sum = x;if (idx > x - 1) {let an = x - 1, a1 = 1, cnt = x - 1; sum += cnt * (a1 + an) / 2; sum += idx - cnt; } else {let cnt = idx, an = x - 1, a1 = an - cnt + 1; sum += cnt * (a1 + an) / 2; }if (n - idx - 1 > x - 1) {let an = x - 1, a1 = 1, cnt = x - 1; sum += cnt * (a1 + an) / 2; sum += n - idx - 1 - cnt; } else {let cnt = n - idx - 1, an = x - 1, a1 = an - cnt + 1; sum += cnt * (a1 + an) / 2; }return sum <= maxSum; };let l = 1, r = maxSum;while (l < r) {let mid = (l + r + 1) >> 1;if (check(n, mid, index, maxSum)) l = mid;else r = mid - 1; }return r;};时间复杂度: 空间复杂度:
最后
巨划算的 LeetCode 会员优惠通道目前仍可用 ~
使用福利优惠通道 leetcode.cn/premium/?promoChannel=acoier,年度会员 有效期额外增加两个月,季度会员 有效期额外增加两周,更有超大额专属 🧧 和实物 🎁 福利每月发放。
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。

夜雨聆风