class Solution {
public:
string largestMultipleOfThree(vector<int>& digits) {
sort(digits.begin(), digits.end(), greater<int>());
int sum = accumulate(digits.begin(), digits.end(), 0);
if (sum == 0) return "0";
const int N = digits.size();
const auto print = [&]() {
if (digits[0] == '0') return to_string(0);
stringstream ss;
for (const auto d : digits) {
if (d == -1) continue;
ss << d;
}
return ss.str();
};
if (sum % 3 == 0) return print();
if (sum % 3 == 1) {
for (int i = N - 1; i >= 0; --i) {
if (digits[i] == 1 or digits[i] == 4 or digits[i] == 7) {
digits[i] = -1;
return print();
}
}
for (int i = N - 1, cnt = 0; i >= 0; --i) {
if (digits[i] == 2 or digits[i] == 5 or digits[i] == 8) {
digits[i] = -1;
if (cnt == 1) {
return print();
}
++cnt;
}
}
}
if (sum % 3 == 2) {
for (int i = N - 1; i >= 0; --i) {
if (digits[i] == 2 or digits[i] == 5 or digits[i] == 8) {
digits[i] = -1;
return print();
}
}
for (int i = N - 1, cnt = 0; i >= 0; --i) {
if (digits[i] == 1 or digits[i] == 4 or digits[i] == 7) {
digits[i] = -1;
if (cnt == 1) {
return print();
}
++cnt;
}
}
}
return "";
}
};