ARTS 打卡第 2 天

A：26. 删除有序数组中的重复项

给你一个 升序排列 的数组 nums ，请你 原地 删除重复出现的元素，使每个元素 只出现一次 ，返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ，你需要做以下事情确保你的题解可以被通过：
更改数组 nums ，使 nums 的前 k 个元素包含唯一元素，并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
返回 k 。

第一次写的版本：

Copy
function removeDuplicates(nums: numbs[]): number {
const record: Record<string, boolean> = {}
for (let i = 0; i < nums.length; i += 1) {
if (record[nums[i]]) {
nums.splice(i, 1)
i -= 1
} else {
record[nums[i]] = true
}
}
return nums.length
}

提交之后显示运行时间和内存占用都只在倒数 20% 的排名位置。于是就去看了题解里面更优的解法，里面提到了 “双指针”。

“双指针” 的思路是记录两个指针位置（不是真正的内存指针），一个快指针，一个慢指针，快指针用于遍历数组，慢指针记录并修改最后一个不同数字的位置，当快指针走完时，慢指针也已经记录好了全部的不相同数字。代码示例如下：

Copy
function removeDuplicates(nums: numbs[]): number {
if (nums.length < 2) {
return nums.length
}
let fast = 1
let slow = 0
while (fast < nums.length) {
if (nums[fast] !== nums[slow]) {
slow += 1
nums[slow] = nums[fast]
}
fast += 1
}
return slow + 1
}

当 nums[fast] !== nums[slow] 时，说明遇到了新的不同数值，于是将这个数值记录到 slow+1 的位置上，当 fast 将 nums 遍历完时，所有不同值也就通过慢指针一个个记录完了。这种方法能使用的前提是这是一个有序数组，我一开始没看到题干里这个条件，还困惑了很久。

“双指针” 方法除了用于用于这个场景，还可以用于类似 “寻找有序数组中两个数的和等于某个值” 的情况，整体思路都是记录两个位置，分别进行遍历或操作，或者两个都在遍历，比如左右两边向中间逼近。

R：Code Interpreter API

作者在 Youtube 上看到大量 ChatGPT 的 Code Interpreter 宣传后，发现这里还有未被实现的需求，于是自己实现了一个。

相比于 ChatGPT 官方的版本，这个自己实现的版本优势是：1. 可以联网获取实时数据，比如可以让它画出比特币 2023 年的价格曲线图；2. 可以本地部署：于是就可以和本地其它应用程序联动，还有更加自由的环境管理，比如安装一些额外的包。

要实现 Code Interpreter，有两个核心要素：一是借助 OpenAI API 的 Function Calling 能力产出要调用函数的代码；二是拥有一个能执行 Python 代码的环境。例如用户指定要输出一个正弦函数图，那么需要得到绘制正弦函数图的代码，然后送到 Python 解释器中执行，输出图片然后展示给用户。在这个过程中 LLM Agent 可能还要对结果做一些解释和细节补充。此外还需要考虑文件 IO 以及会话中变量保存的能力。

这里 Python 解释器和文件 IO、变量保存都可以看作是 LangChain 的一个 Tool，把它塞到 LangChain 里被调用即可，这个 “Tool” 作者把它制作成了 codebox-api 项目（也是昨天打卡的时候分享的项目）。它的底层实现是每当创建一个新的 Session 的时候，就会创建一个新的 Jupyter Kernel 会话。

整体解决方案作者把它封装成了 codeinterpreter-api，以方便使用者更简单地创建 Session，执行 Code Interpreter。

作者的后续计划是：让它更容易部署和扩展，变成生产可用的 API，同时支持更多的模型，比如 Claude-V2, Open Orca。作者也欢迎大家来一起贡献。

T：中文 DOS 游戏

一个中文 DOS 游戏项目，可以在网页端玩两千多款经典的 DOS 游戏。

S：阅读《饥饿的盛世：乾隆时代的得与失》 的笔记

文明所采用的体制没有唯一的标准，没有最好只有更好，乾隆已经将封建王朝的体制效率发挥到了极致，但依然阻挡不了历史的车轮将王朝碾过。要实现体制的进化，文化和思想的解放是必要条件，只有飞扬超脱的思想才能将文明推向下一个阶段（当然也可能是毁灭）。

Reference:

ARTS 打卡活动