LeetCodeの Mendix: その部分の合計 | Mendix

メインコンテンツへスキップ

LeetCodeの Mendix: 部分の合計

Leetcodeの Mendix - 部分の合計 - ブログのサムネイル

ローコードを使用してコーディング チャレンジを完了できますか? もちろんです! しかし、なぜでしょうか?

ソフトウェア エンジニアリングの仕事に応募する場合、準備として現在流行しているのは「LeetCode」チャレンジを完了することです。LeetCode は、ソフトウェア エンジニアが面接で聞かれる可能性のある質問に備えるために特別に設計された問題で構成されたサイトです。現在、2,000 を超えるチャレンジが用意されており、すべて候補者の効率、パターン、問題解決に関する知識をテストするように設計されています。

ここに、複数の言語でのコーディング スキルをテストするために特別に設計されたコーディング チャレンジが満載のサイトがあります。C# と JavaScript を学んだ経験があるので、これらの言語のいずれかを使用してこれらの問題に簡単に取り組むことができますが、もうそうではありません。私は現在、ロー コードの伝道者です。これらの問題にロー コードで取り組むべきではないでしょうか?

確かに、ローコードはこのような問題に特化したものではありません。これはビジネスアプリケーションの構築を目的としたプラットフォームであり、超効率化に重点を置いた問題解決を目的としたものではありません。しかし、これらの課題が候補者のテストに使用されるのには理由があります。それは、実際のアプリケーションに適用できるからです。それでは、この課題に挑戦して、完了できるかどうかを見てみましょう。その後、これが実際のアプリケーションにどのように適用できるか、そしてどのように Mendix それを構築するために使用できます。

チャレンジ1: 2つの合計

この課題では、数値の配列を取得し、2 つの数値を加算すると目標値になる 2 つの数値のインデックスを見つけます。一見すると、この課題は単純です。配列を取得してループし、各値について再度ループして、目標値を作成するために必要な値を見つけます。非効率的ですが、単純です。それでは、ここから始めましょう。

まず、配列を表す文字列、ターゲット値を表す整数属性、および条件を満たす項目のインデックスを格納するために必要ないくつかの値 (以下を参照) を受け取る単純なエンティティを作成します。また、効率を追跡するために開始/終了時刻も追加します。

配列を表す文字列を受け取る単純なエンティティについての画像

このエンティティを作成したら、値を入力してチャレンジの詳細を追跡するためのフォームを組み立てることができます。特別なことは何もせず、実用的であることが重要です。ご覧のとおり、マイクロフローを実行するためのボタンも追加する必要があります。(マイクロフローとは、 Mendix 関数を呼び出します。

値を入力し、チャレンジの詳細を追跡するためのフォームの画像

問題 1: 文字列配列。 Mendix 実際には、文字列配列を扱うようには設計されていません。この問題を実際のソリューションで解決するのであれば、扱うオブジェクトのリストが必要になります。この時点ではちょっとズルをしているような気がするので、今は文字列を扱うだけにしましょう。

コミュニティコモンズモジュールは、 Mendix Marketplace は、文字列をリストに分割するために使用できる関数を提供し、各項目にインデックスで便利なラベルを付けます。ただし、値を整数に変換することはできないため、その場で処理する必要があります。

値のリストができたので、リスト 1 をループし、最初の値がターゲットを超えていないと仮定して、もう一度ループして、合計するとターゲットになる別の値があるかどうかを確認するだけです。

コミュニティコモンズモジュールは、文字列をリストに分割するために使用できる関数を提供します。

ただし、この方法で設定すればうまくいくはずなので、試してみましょう。

入力配列の画像

完璧です! 見事に機能しました。これで完了ですね? いいえ、まだです。さらに課題があります: O(n2) 未満の時間計算量でアルゴリズムを考案できますか?

このソリューションにはネストされたループがあるため、これが最も効率的な方法ではないことは明らかです。では、最も効率的な方法は何でしょうか? ポインターです。リストをソートし、先頭にポインターを置き、最後にポインターを置きます。2 つの項目の合計をチェックし、小さすぎる場合は最初のポインターをリストの上に移動し、大きすぎる場合は最後のポインターを下に移動します。ソリューションが見つかるか、リストがなくなるまで繰り返します。

これを実行するには、いくつかの重要な課題があります。まず、ソートされたリストです。リストは文字列として保存されるため、値でソートすることはできません。ループして各値を整数に変換する必要があります。

次に、インデックス値を使用してリストにアクセスすることはできません。 Mendix したがって、インデックス ポインターを 2 つだけ持つことはできません。ただし、リスト操作の「Head」アクションを使用してリストから最初のオブジェクトを取得するという簡単な回避策があります。その後、リストのコピーを 2 つ保持します。1 つは昇順で、もう 1 つは降順です。リストを順に処理していくと、現在チェックしている項目が高すぎたり低すぎたりする場合は、対応するリストからその項目を削除します。

リスト操作「Head」アクションを使用してリストから最初のオブジェクトを取得する簡単な回避策

アプリケーションは意図したとおりに動作しますが、数値リストが小さい場合、2 つのループを使用するブルート フォース アプローチよりも効率は低くなります。ただし、値の数が増えると、はるかに効率が高くなります。

これは、従来のコードで実行していたことが、少しの創造的思考でローコードでも実行可能であることを示しています。では、これをさらに一歩進めて、これが現実のビジネス上の問題だったらどうなるでしょうか?

私たちは、製品を梱包している会社で働いていて、2 つの製品を 1 つの箱に梱包したいとします。ただし、箱の重量制限に合わせる必要があります。それより高くても低くてもいけません。そのためには、一緒に梱包したときに目標値に一致する 2 つの製品を在庫から見つける必要があります。聞き覚えがありますか?

まず、これをやってみましょう Mendix 最初から適切なエンティティにデータをロードする方法を紹介します。ランダムな値のリストを生成し、それを先ほど作成した結果エンティティにリンクします。また、製品を追跡できるように永続化します。

最初から適切なエンティティにデータをロードする

ランダムな値のリストを生成し、それを先ほど作成した結果エンティティにリンクします。

 

これで、開始するためのリストができたので、2 回目の試行で取得したコードをリファクタリングするだけです。元の Microflow のこのセクションは、サブ Microflow に簡単に抽出でき、元の関数と新しい関数の両方で使用できます。

元のマイクロフローのこのセクションは、簡単にサブマイクロフローに抽出でき、元の関数と新しい関数の両方で使用できます。

これで、データを処理する 3 つの異なる方法が用意されました (数値のリストが生成されると、文字列配列も設定されるので、最初の 2 つの関数は引き続き機能します)。

現在、データを処理するには3つの異なる方法があります

これで、最初の完全一致が見つかります。どの製品が梱包され、どの製品とペアになっているかを追跡する方法が必要になります。これを行う方法はたくさんありますが、製品に自己関連付けを使用します。これにより、必要に応じて製品間を簡単に移動できます。また、メイン バッチが削除された場合に製品を自動的に削除するようにエンティティ間の関連付けを設定しました。わかりやすくするために、エンティティの名前を「バッチ」と「製品」に変更したことがわかります。

製品に自己関連付けを使用します。これにより、必要に応じて製品間を簡単に移動できるようになります。

また、一致を見つけるために Microflow の動作方法を変更する必要もあります。これは、1 つの完全一致だけを探しているのではなく、すべての完全一致を見つけたいからです。また、リストをデータベースに戻して並べ替える作業を行うことで、さらに最適化を加えることもできます。

リストをソートする作業をデータベースに戻すことで、さらに最適化を追加します。

ご覧のとおり、一致が見つかると、2 つの製品が相互にリンクされ、チェック対象のリストから削除されます。その後、次の 2 つの製品に進みます。

完成したアプリケーションのスクリーンショットを以下に示します。表示されているバッチでは、764 個の製品をペアリングできたことがわかります。これは、関連付けの両側から製品が表示されるため、すべての製品を実質的に XNUMX 回表示することになるため、データを表示する最適な方法ではありませんが、機能していることがわかります。

完成したアプリケーションのスクリーンショット

どちらかといえば、このデータを構造化する最善の方法は、おそらく「ボックス」という 3 番目のエンティティを用意し、そこから 2 つの製品を関連付けることであるという事実を強調しています。そうすれば、一意のボックス ID を生成し、各製品を 1 回だけ表示できます。

このデータを構造化する最善の方法は、おそらく「Box」という 3 番目のエンティティを用意し、そこから 2 つの製品を関連付けることです。

そこから、これを顧客、宅配業者、さらには店頭にリンクさせるのは、ほんの数ステップです。 Mendix 経費フォームや休暇申請システムだけでなく、これらのアプリケーションを簡単に構築できます。当社は「ローコード」プラットフォームですが、複雑な問題を解決するアプリケーションの構築に使用できないわけではありません。ローコードでは不十分な場合でも、Java アクションを使用してアプリケーションを拡張できます。

しばらくお待ちください 私の次の投稿 ここで、より難しい課題の 1 つ、「最も多くの水を持つ容器」に挑戦します。これは、さまざまな高さの列を取得し、どの列のペアが最も多くの水を保持できる容器、または列間の長方形の領域が最も大きい容器を形成するかを計算するというものです。

言語を選択してください