昇順に並べられた配列 nums が与えられます。重複する要素を削除し、各要素が一度だけ現れるように、配列を変更し、新しい長さを返します。要素の相対的な順序は変更しないでください。そして、nums のユニークな要素の数を返します。
nums のユニークな要素の数を k とすると、次のことを行う必要があります:
nums を変更し、nums の最初の k 個の要素にユニークな要素を含め、それらが元の順序で nums に現れるようにします。nums の残りの要素は重要ではありません。
k を返します。
最初のバージョン:
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%に位置していることが表示されました。そのため、より優れた解法が解説にあることに気づきました。そこでは「双方向ポインタ」について言及されています。
「双方向ポインタ」のアイデアは、2 つの位置(実際のメモリポインタではない)を記録することです。1 つは速いポインタで、もう 1 つは遅いポインタで、速いポインタは配列を走査し、遅いポインタは最後の異なる数字の位置を記録および変更します。速いポインタが配列を完全に走査すると、遅いポインタもすべての異なる値を記録します。コードの例を以下に示します:
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
を走査し終わると、すべての異なる値が遅いポインタによって記録されます。この方法は、配列がソートされていることが前提となりますが、最初に問題文でこの条件を見落としていました。
「双方向ポインタ」の方法は、ソートされた配列内の 2 つの数の合計が特定の値に等しい場合など、他のシナリオでも使用できます。全体的なアイデアは、2 つの位置を記録し、それぞれを走査または操作することです。両方を走査する場合もありますが、例えば左右の位置を中央に近づけるなどの方法があります。
著者は、YouTube で ChatGPT の Code Interpreter のプロモーションを見た後、まだ実装されていない要件があることに気づき、自分で実装しました。
ChatGPT の公式バージョンと比較して、この独自のバージョンの利点は次のとおりです:1. リアルタイムデータを取得できるため、ビットコインの 2023 年の価格グラフを描画することができます。2. ローカルに展開できるため、他のローカルアプリケーションと連携することができ、さらに自由な環境管理が可能です。例えば、追加のパッケージをインストールすることができます。
Code Interpreter を実装するためには、2 つの主要な要素が必要です。1 つは OpenAI API の関数呼び出し機能を使用して、呼び出す関数のコードを生成することです。もう 1 つは Python コードを実行できる環境を持つことです。たとえば、ユーザーがサイン関数のグラフを出力することを指定した場合、サイン関数のグラフを描画するコードを取得し、Python インタプリタで実行し、画像をユーザーに表示する必要があります。このプロセスでは、LLM エージェントが結果を解釈し、詳細を補完する場合もあります。さらに、ファイルの入出力やセッション内の変数の保存の能力も考慮する必要があります。
ここでの Python インタプリタやファイルの入出力、変数の保存は、LangChain のツールの 1 つと見なすことができます。それを LangChain に組み込んで呼び出すことができます。この「ツール」は、codebox-apiプロジェクトとして作成されました(昨日の投稿で共有したプロジェクトです)。その基礎となる実装は、新しいセッションが作成されるたびに新しい Jupyter カーネルセッションが作成されるというものです。
全体的なソリューションは、作者がcodeinterpreter-apiとしてパッケージ化し、使用者がより簡単にセッションを作成し、Code Interpreter を実行できるようにしました。
著者の今後の計画は、デプロイと拡張をより容易にし、本番で使用できる API にすることです。また、Claude-V2、Open Orca など、さらに多くのモデルをサポートする予定です。著者は皆さんの貢献も歓迎しています。
中文 DOS ゲームのプロジェクトで、ウェブブラウザ上で 2000 以上のクラシックな DOS ゲームをプレイすることができます。
S:「飢餓する時代:乾隆時代の得と失」のノートを読む
文明は、一つの標準だけでなく、最善ではなく、より良いものがあるということを採用しています。乾隆は封建王朝の体制の効率を最大限に引き出しましたが、歴史の車輪が王朝を踏みにじることは防げませんでした。体制の進化を実現するには、文化と思想の解放が必要な条件です。飛躍的な思考だけが文明を次の段階に押し進めることができます(もちろん、破壊する可能性もあります)。
参考文献: