C++の辞書式順序
整数nがあるとします。辞書式順序で1からnを返す必要があります。したがって、たとえば13が指定された場合、出力は[1、10、11、12、13、2、3、4、5、6、7、8、9]になります。
これを解決するには、次の手順に従います-
-
サイズnの1つの配列retを定義します
-
curr:=1
-
0からn–1の範囲のiの場合
-
ret [i]:=curr
-
curr * 10 <=nの場合、curr:=curr * 10
を設定します -
それ以外の場合
-
curr> =nの場合、curr:=curr / 10
-
currを1増やします
-
currは10で割り切れますが、curr:=curr / 10
-
-
-
retを返す
例(C ++)
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: vector<int> lexicalOrder(int n) { vector <int> ret(n); int curr = 1; for(int i = 0; i < n; i++){ ret[i] = curr; if(curr * 10 <= n){ curr*= 10; } else { if(curr>= n)curr /= 10; curr += 1; while(curr % 10 == 0)curr/=10; } } return ret; } }; main(){ Solution ob; print_vector(ob.lexicalOrder(20)); }
入力
20
出力
[1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 3, 4, 5, 6, 7, 8, 9, ]
-
C++でのデュードニー番号
与えられた数の底の数理論で定義された数は、最初の自然数の桁の合計が2番目の数の桁の合計に等しくなるように、別の自然数の完全な3乗に等しい自然数です。 (ウィキペディア)。 番号はヘンリー・デュードニーによって発見されました 。その数式 は- ここでは、整数nが与えられます。私たちの仕事は、与えられた番号nが人物番号であるかどうかを確認することです。 問題を理解するために例を見てみましょう 入力: N =17592 出力: いいえ 説明: 与えられた番号はダドニー番号ではありません。 ソリューションアプローチ- 解決策は、デュードニー番号の基本的な定義にあります。
-
C++で最大のBSTサブツリー
二分木があるとしましょう。その中で最大のサブツリーを見つける必要があります。ここで、最大とは、ノードの数が最も多いサブツリーを意味します。 したがって、入力が次のような場合、 この場合、最大のBSTサブツリーが強調表示されているため、出力は3になります。 これを解決するには、次の手順に従います- データと呼ばれる1つの構造を定義します。サイズ、maxVal、minVal、okの4つの値があり、okはtrue/falseの値のみを保持できます 解決(TreeNode *ノード) ノードがnullの場合、&miuns; 初期化してデータを返す(0、無限大、-無