この記事では主に、文字列に対する JS の完全な置換アルゴリズムと、文字列を指定して、文字列内のすべての文字の組み合わせの完全な置換を見つける方法について説明します。含まれる文字は繰り返されません。
输入:"abc" 输出:["abc","acb","bac","bca","cab","cba"]
アルゴリズムの実装時に問題が発生しましたが、まだ解決できません。しかし、全順列アルゴリズムは非常に重要なので、記録するためにこの記事を書きました。
アルゴリズム 1: 再帰的
アルゴリズムのアイデア:
文字列の長さが 1 の場合、文字列を出力します。
-
長さが 1 より大きい場合、文字列の最初の文字を取得し、 length -1 文字列のすべての順列。各順列の任意の位置に最初の文字を挿入します。
アルゴリズムの実装:
function permutate(str) { //保存每一轮递归的排列结果 var result = []; //初始条件:长度为1 if (str.length == 1) { return [str] } else { //求剩余子串的全排列,对每个排列进行遍历 var preResult = permutate(str.slice(1)); for (var j = 0; j <p> アルゴリズムを理解するのは難しくないはずです。ただし、パラメータ文字列が <code>"abcdefghijkl"</code> の場合、配置に使用される領域は <code>12!=479001600</code> となり、メモリを過剰に使用するとメモリ オーバーフローが発生します。自分の PC で実行している場合は、<code>node --max-old-space-size=8192</code> を使用してメモリを変更できます。ただし、Codewars 上で実行する必要があるため、メモリを変更することはできません。そこで私のアイデアは、末尾再帰最適化を使用することでした。ははは、Node の末尾再帰最適化ですか?何でもいいので、まずは試してみましょう。 <code>"abcdefghijkl"</code>时,排列用到的空间是<code>12!=479001600</code>,过大的内存占用导致内存溢出。如果你是在自己的PC上执行,那么可以使用<code>node --max-old-space-size=8192</code>来修改内存。但是我需要在Codewars上执行,所以无法修改内存。于是我想的办法是利用尾递归优化。呵呵,Node的尾递归优化?不管了,先试试吧。</p><h1 id="算法二-尾递归">算法二:尾递归</h1><pre class="brush:php;toolbar:false">function permutate(str,result) { 'use strict'; let tempArr = []; //终止条件str长度为0 if (str.length == 0) { return result } else { //第一次递归时,插入首字母 if(result.length === 0){ tempArr.push(str[0]); }else{ for (let i = 0; i <p>函数的第一个参数是本次递归的字符串,第二个参数是前x个字符的全排列结果。<br>思路是:</p><ol class=" list-paddingleft-2"> <li><p>每次取当次递归串的第一个字母;</p></li> <li><p>若第二个参数长度为0说明是第一次递归,则初始化本次结果为<code>[首字母]</code>。然后将首字母从递归串中剔除,剩余串传给下一次递归;</p></li> <li><p>之后每一次递归,都取递归串的首字母,将其插入前x个字符的全排列的所有位置,求出x+1个字符的全排列;</p></li> <li> <p>递归直到第一个参数为空串,则第二个参数为字符串所有字符的全排列。</p> <p>可能不太好理解,不过知道这是尾递归就行了。虽然尾递归在ES6的严格模式中才有效,但是,我加上<code>'use strict';</code></p>アルゴリズム 2: 末尾再帰</li> <pre class="brush:php;toolbar:false">function perm(str) { let result = [],tempArr = []; let subStr = str; while (subStr.length !== 0) { if (result.length === 0) { result.push(str[0]); } else { for (let i = 0; i関数の最初のパラメーターはこの再帰の文字列で、2 番目のパラメーターは最初の x 文字の完全な配置結果です。
アイデアは次のとおりです。現在の再帰文字列の最初の文字を毎回取得します。
の後の再帰ごとに、再帰文字列の最初の文字を取得し、それを最初の x 文字のすべての位置に挿入して検索します。 x+1 文字の完全な順列を取得します。
は、最初のパラメーターが空の文字列になるまで再帰的に実行され、その後、2 番目のパラメーターが文字列内のすべての文字の完全な順列になります。
理解するのは簡単ではないかもしれませんが、これが末尾再帰であることを知ってください。末尾再帰は ES6 の strict モードでのみ有効ですが、'use strict';
を追加した後でも機能しません。実際には、関数呼び出しスタックのオーバーフローではなく、変数を格納するヒープのオーバーフローだと思います。したがって、おそらく解決策はありません。結局のところ、完全な配置がどのようなものであっても、空間の複雑さは O(n!) です。 🎜🎜🎜🎜アルゴリズム 3: ループ🎜🎜 最後に、ループのコードを投稿します。これは役に立ちません。アイデアの拡張として使用してください。 🎜rrreee🎜関連する推奨事項: 🎜🎜🎜JS の完全な置換と組み合わせアルゴリズムの実装方法🎜🎜🎜🎜 JavaScript でのいくつかの再帰的な完全な置換アルゴリズムの例の詳細な説明🎜🎜🎜🎜JavaScript の興味深い質問: 完全な置換と重複排除🎜🎜以上がJSの文字列の完全配置アルゴリズムとメモリオーバーフローを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境
