คำอธิบายโจทย์
กำหนดอาร์เรย์ของตัวเลข (digits) ให้หาเลขคูณของ 3 ที่มากที่สุดที่สามารถสร้างได้โดยการนำตัวเลขมาเรียงต่อกันในลำดับใดก็ได้ คำตอบอาจใหญ่มาก จึงคืนค่าเป็น string หากไม่มีคำตอบให้คืน string ว่าง
ตัวอย่าง
Input: [7,2,8] → Output: "87" (เพราะ 87 หาร 3 ลงตัว และมากที่สุด)
วิธีแก้ปัญหา
- จัดกลุ่มตัวเลขตาม modulo 3: d[0], d[1], d[2]
- เรียงตัวเลขจากมากไปน้อย
- คำนวณผลรวม modulo 3 (sum)
- ถ้า sum != 0:
- ถ้ามีตัวเลขในกลุ่ม d[sum] → ลบตัวเลขน้อยสุดออก 1 ตัว
- ไม่มี → ลบตัวเลขน้อยสุด 2 ตัวจากกลุ่ม d[3-sum]
- รวมตัวเลขที่เหลือ เรียงจากมากไปน้อยต่อเป็น string
- กรณีพิเศษ: ถ้าตัวแรกเป็น '0' → คืน "0"
การทำงานของโค้ด
#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 x : digits) {
d[x % 3].push_back(x);
sum = (sum + x) % 3;
}
if (sum) {
if (d[sum].empty()) {
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 x : d[i])
ret += to_string(x);
sort(ret.begin(), ret.end(), greater<char>());
if (!ret.empty() && 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