मान लीजिए हमारे पास अंकों की एक सरणी है, हमें उन अंकों को किसी भी क्रम में जोड़कर बनने वाला तीन का सबसे बड़ा गुणक ज्ञात करना है। उत्तर बहुत बड़ा हो सकता है इसलिए इसे स्ट्रिंग के रूप में लौटाएं। यदि कोई उत्तर नहीं है तो खाली स्ट्रिंग लौटाएं।
यदि इनपुट [7,2,8] है, तो आउटपुट 87 होगा।
हल करने के चरण
तीन पंक्तियों वाला एक 2D सरणी d परिभाषित करें
अंकों की सरणी को क्रमबद्ध करें
sum := 0
प्रत्येक अंक के लिए: x := अंक, d[x mod 3] में डालें, sum := (sum + x) mod 3
यदि शून्येतर है, तो: यदि d[sum] खाली है तो rem := 3 - sum, यदि d[rem] का आकार < 2 तो खाली स्ट्रिंग लौटाएं, अन्यथा d[rem] से दो तत्व हटाएं; अन्यथा d[sum] से एक तत्व हटाएं
ret := खाली स्ट्रिंग
सभी शेष वर्गों के अंकों को जोड़ें
ret को अवरोही क्रम में क्रमबद्ध करें
यदि ret का पहला अंक '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;
}
};
int main() {
Solution ob;
vector<int> v = {7,2,8};
cout << (ob.largestMultipleOfThree(v));
return 0;
}
इनपुट
{7,2,8}
आउटपुट
87