3723.数位平方和的最大值

目标

给你两个 正 整数 num 和 sum。

如果一个正整数 n 满足以下两个条件,则称其为 好整数 :

  • n 的位数 恰好 为 num。
  • n 的各位数字之和 恰好 为 sum。

一个 好整数 n 的 分数 定义为 n 的各位数字的平方和。

返回一个 字符串 ,表示能获得 最大分数 的 好整数 n。如果有多个可能的整数,返回 最大 的那个。如果不存在这样的整数,返回一个空字符串。

示例 1:

输入: num = 2, sum = 3
输出: "30"
解释:
有 3 个好整数:12、21 和 30。
12 的分数是 12 + 22 = 5。
21 的分数是 22 + 12 = 5。
30 的分数是 32 + 02 = 9。
最大分数是 9,由好整数 30 获得。因此,答案是 "30"。

示例 2:

输入: num = 2, sum = 17
输出: "98"
解释:
有两个好整数:89 和 98。
89 的分数是 82 + 92 = 145。
98 的分数是 92 + 82 = 145。
最大分数是 145。获得此分数的最大好整数是 98。因此,答案是 "98"。

示例 3:

输入: num = 1, sum = 10
输出: ""
解释:
不存在恰好有 1 位数字且各位数字之和为 10 的整数。因此,答案是 ""。

说明:

  • 1 <= num <= 2 * 10^5
  • 1 <= sum <= 2 * 10^6

思路

定义数位长度为 num,数位之和为 sum 的整数为好整数,好整数的分数定义为各位数字的平方和,返回分数最大的好整数,如果分数相同则返回整数值最大的,如果不存在返回空串。

贪心策略就是取当前位所能取的最大值,余下的补 0。

代码


/**
 * @date 2026-10-14 9:21
 */
public class MaxSumOfSquares3723 {

    public String maxSumOfSquares(int num, int sum) {
        StringBuilder sb = new StringBuilder();
        while (num > 0) {
            int d = Math.min(sum, 9);
            sum -= d;
            num--;
            sb.append(d);
        }
        return sum == 0 ? sb.toString() : "";
    }

}

性能