当前位置: 代码迷 >> 综合 >> 四、形成三的最大倍数(Weekly Contest 177)
  详细解决方案

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

热度:56   发布时间:2023-09-23 14:20:25.0

题目描述:
给你一个整数数组 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;}
// 尝试去掉ifor (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 ();}
}
  相关解决方案