数字の配列から3の最大の倍数を見つける-C++で2を設定する
したがって、入力が[7,2,8]の場合、出力は87になります。
これを解決するには、次の手順に従います-
-
1つの2D配列dを定義します。3つの行があります
-
配列の数字を並べ替える
-
合計:=0
-
初期化i:=0の場合、i <桁のサイズの場合、更新(iを1増やします)、実行-
-
x:=桁[i]
-
d [x mod 3]
の最後に数字[i]を挿入します -
合計:=合計+ x
-
sum:=sum mod 3
-
-
合計がゼロ以外の場合、-
-
d [sum]のサイズでない場合、-
-
rem:=3-合計
-
d [rem] <2のサイズの場合、-
-
空の文字列を返す
-
-
d[rem]から最後の要素を2回削除する
-
-
それ以外の場合
-
d [sum]
から最後の要素を削除します
-
-
-
ret:=空の文字列
-
初期化i:=0の場合、i <3の場合、更新(iを1増やします)、実行-
-
初期化j:=0の場合、j
-
ret:=ret concatenate d [i、j] as string
-
-
-
配列を並べ替えますret
-
retとret[0]のサイズが「0」と同じである場合、-
-
「0」を返す
-
-
retを返す
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string largestMultipleOfThree(vector<int>& digits) {
vector<vector<int>> d(3);
sort(digits.begin(), digits.end(), greater<int>());
int sum = 0;
for (int i = 0; i < digits.size(); i++) {
int x = digits[i];
d[x % 3].push_back(digits[i]);
sum += x;
sum %= 3;
}
if (sum) {
if (!d[sum].size()) {
int rem = 3 - sum;
if (d[rem].size() < 2)
return "";
d[rem].pop_back();
d[rem].pop_back();
}
else {
d[sum].pop_back();
}
}
string ret = "";
for (int i = 0; i < 3; i++) {
for (int j = 0; j < d[i].size(); j++) {
ret += to_string(d[i][j]);
}
}
sort(ret.begin(), ret.end(), greater<int>());
if (ret.size() && ret[0] == '0')
return "0";
return ret;
}
};
main(){
Solution ob;
vector<int> v = {7,2,8};
cout << (ob.largestMultipleOfThree(v));
} 入力
{7,2,8} 87
-
C++のツリーで最大のサブツリーの合計を検索します
この問題では、二分木が与えられます。私たちのタスクは、ツリー内で最大のサブツリーの合計を見つけることです。 問題の説明: 二分木は、正の値と負の値で構成されます。そして、ノードの合計が最大のサブツリーを見つける必要があります。 問題を理解するために例を見てみましょう。 出力: 13 説明: 左サブツリーの合計は7です 右サブツリーの合計は1です ツリーの合計は13です ソリューションアプローチ この問題を解決するために、ポストオーダートラバーサルを実行します。ノードの左側のサブツリーと右側のサブツリーの合計を計算します。現在のノードについて、現在のノードの
-
C ++でSTLを使用して配列の要素の合計を見つける方法は?
ここでは、配列のすべての要素の合計を見つける方法を説明します。したがって、配列が[12、45、74、32、66、96、21、32、27]の場合、合計は405になります。したがって、ここでは、accumulate()関数を使用してこの問題を解決する必要があります。この関数の説明は、ヘッダーファイル内にあります。 例 #include<iostream> #include<numeric> using namespace std; int main() { int arr[] = {12, 45, 74, 32, 66, 96, 21, 32, 2