乐于分享
好东西不私藏

领导默认大家都在 AI Coding,原来一周排期的工作,第二,第三天就问能不能上线了..

领导默认大家都在 AI Coding,原来一周排期的工作,第二,第三天就问能不能上线了..

AI Coding

日常逛脉脉,发现了一篇神贴。

一位网友在字节同事圈发文,表示自己遇到了新卷王,周五下午才刚评完了 PRD,结果周一上午就发了上线单。

这背后的原因,还是因为 AI 提效。

自从有了 AI Coding,卷王基本上 24 小时就有产出,而且现在领导们也默认了大家都在使用 AI Coding,原来一周排期的工作,现在基本上在第二第三天就来问能不能上线了。

这位网友还表示,自己作为传统程序员,目前还无法完全信任 AI 产出,觉得还是需要花费很多精力去做 review,表示无法破局。

首先,这困境肯定是存在的,而且是普遍的。

现在的 AI Coding 发展很快,我觉得 24 小时内有产出,都属于偏保守了,基本上 PRD 一喂,80% 以上的工作,都能在 3~4 小时内完成,DDD(规范驱动设计)做得好的,甚至是 90% 的工作都能一次性完成。

但网友可不会给你认真分析,还有不怕事大的,半带调侃得说到:这还卷,应该周五晚就上线 🤣🤣

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

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

这就导致确实是一个困境,总有人为了绩效(产出),而无视长期质量,但最终的长期质量是由所有人来埋单。

这就导致了一个很现实的问题:要么加入,要么被淘汰。

对此,你怎么看?欢迎评论区交流。

...

回归主题,来一道和「字节跳动」相关的算法题。

题目描述

平台:LeetCode

题号:1802

给你三个正整数 nindex 和 maxSum

你需要构造一个同时满足下述所有条件的数组 nums(下标 从 0 开始 计数):

  • nums.length == n
  • nums[i] 是 正整数 ,其中 0 <= i < n
  • abs(nums[i] - nums[i+1]) <= 1 ,其中 0 <= i < n-1
  • nums 中所有元素之和不超过 maxSum
  • nums[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 - 11, 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 - 11, 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 <= maxSum

TypeScript 代码:

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,年度会员 有效期额外增加两个月,季度会员 有效期额外增加两周,更有超大额专属 🧧 和实物 🎁 福利每月发放。

我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻

欢迎关注,明天见。