给你一个整数数组 digits
,你可以通过按任意顺序连接其中某些数字来形成 3 的倍数,请你返回所能得到的最大的 3 的倍数。
由于答案可能不在整数数据类型范围内,请以字符串形式返回答案。
如果无法得到答案,请返回一个空字符串。
示例 1:
输入:digits = [8,1,9] 输出:"981"
示例 2:
输入:digits = [8,6,7,1,0] 输出:"8760"
示例 3:
输入:digits = [1] 输出:""
示例 4:
输入:digits = [0,0,0,0,0,0] 输出:"0"
提示:
1 <= digits.length <= 10^4
0 <= digits[i] <= 9
- 返回的结果不应包含不必要的前导零。
思路:这题需要稍微想一下,其实无非就三种情况:
(1)所有位上的数字之和为3的倍数,此时直接按照位上数字大小从大到小排序输出即可
(2)所有位上的数字之和对3取余为1,此时有两种决策,第一种是存在一个对3取余为1的数字直接去掉尽量小的就好了,第二种是找到两个尽量小的对3取余为2的数去掉,这样一定是最优解。
(3)所有位上的数字之和对3取余为2,此时有两种决策,第一种是存在一个对3取余为2的数字直接去掉尽量小的就好了,第二种是找到两个尽量小的对3取余为1的数去掉即可。
class Solution {
public String largestMultipleOfThree(int[] digits) {
Arrays.parallelSort(digits);
int sum=0;
boolean mark=false;
boolean[] flag=new boolean[digits.length];
for(int i=0;i<digits.length;i++)
sum+=digits[i];
if(sum%3==1) {
for(int i=0;i<digits.length;i++) {
if(digits[i]%3==1){
flag[i]=true;
mark=true;
break;
}
}
if(!mark) {
int num=0;
for(int i=0;i<digits.length;i++) {
if(digits[i]%3==2) {
if(num==2) break;
flag[i]=true;
num++;
}
}
if(num!=2) return "";
}
}
else if(sum%3==2) {
for(int i=0;i<digits.length;i++) {
if(digits[i]%3==2){
flag[i]=true;
mark=true;
break;
}
}
if(!mark) {
int num=0;
for(int i=0;i<digits.length;i++) {
if(digits[i]%3==2) {
if(num==1) break;
flag[i]=true;
num++;
}
}
if(num!=2) return "";
}
}
StringBuilder ans=new StringBuilder();
for(int i=digits.length-1;i>=0;i--) {
if(flag[i]) continue;
ans.append(""+digits[i]);
}
if(sum==0) return "0";
return ans.toString();
}
}