四、形成三的最大倍数(Weekly Contest 177)

题目描述:
给你一个整数数组 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
返回的结果不应包含不必要的前导零。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-multiple-of-three
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

贪心:首先将数组排序,并且看和是否能够被三整除,如果可以那么就是排序后的递减就是最大,否则我们找sum % 3 == 1 或者 sum % 3 == 2的情况,能减去一个的就减去一个,否则减去两个,比如 1 1 1 2 我们删除一个2就可以满足而不用删除两个1,因此贪心法即可:
代码

class Solution {
   
    public String largestMultipleOfThree(int[] digits) {
        int sum = 0;
        for (int digit : digits) {
            sum += digit;
        }
        Arrays.sort (digits);
        if(digits[digits.length - 1] == 0){
            return "0";
        }
        if(sum % 3 == 0){
            String s = get (digits, -1,-1);
            return s;
        }
//        尝试去掉i
        for (int i = 0; i < digits.length; i++) {
            if(digits[i] % 3 == sum % 3){
                return get (digits,i,-1);
            }
        }
//        去掉两个
        for (int i = 0; i < digits.length; i++) {
            for (int j = i + 1; j < digits.length; j++) {
                if((digits[i] + digits[j]) % 3 == sum % 3){
                    return get (digits,i,j);
                }
            }
            
        }
        return "0";
    }
    public String get(int []digits,int j,int k){
        StringBuilder sb= new StringBuilder ();
        for (int i = digits.length - 1; i >= 0; i--) {
            if(j == i || i == k){
                continue;
            }
            sb.append (digits[i]);
        }
        return sb.toString ();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章