
2026-03-15:数位平方和的最大值。用go语言,给定两个正整数 num 和 sum。我们要在所有满足以下两个条件的正整数中寻找最佳解:
对每一个满足上述条件的数,按照它各位数字的平方和来评估其得分。目标是找出得分最高的那一个,并以字符串形式返回该数;如果有多个得分相同的候选者,则返回数值较大的那个;如果不存在任何满足条件的数,则返回空字符串。
1 <= num <= 200000。
1 <= sum <= 2000000。
输入: num = 2, sum = 3。
输出: "30"。
解释:
有 3 个好整数:12、21 和 30。
12 的分数是 。
21 的分数是 。
30 的分数是 。
最大分数是 9,由好整数 30 获得。因此,答案是 "30"。
题目来自力扣3723。
题目要求构造一个 num 位正整数,满足两个硬性条件:
首先要判断是否存在满足条件的数:
num × 9sum > num×9:没有任何数字能满足和为sum,直接返回空字符串sum < 1:也不满足正整数要求,返回空字符串对应示例:num=2,sum=3 2×9=18 ≥ 3,合法,继续计算。
我们的目标:
在数字总和固定的前提下: ✅ 数字越大、越集中,平方和越大 ❌ 数字越分散、越小,平方和越小
举例:总和=3
同时:要让数字本身最大,必须把大数字放在高位。
基于上述结论,构造最优解的逻辑是:
9是单个数字中平方最大的数,优先用9能最大化平方和。
计算能放多少个连续的9:
9的个数 = sum ÷ 9(整除结果)
示例:sum=3,3÷9=0 → 0个9
sum除以9后会有余数:
余数 = sum % 9
这个余数就是除了9之外,唯一需要的非零数字。
示例:3%9=3 → 余数=3
把「所有9」+「余数」拼接在一起,这一段是平方和最大的数字组合。
示例:0个9 + 3 → 核心段="3"
总位数要求是num位,前面的核心段长度不足,需要补0:
示例:num=2,核心段长度=1 → 补1个0 最终结果:3 + 0 = "30"
整个算法只做了固定次数的数学计算和字符串拼接:
总时间复杂度:O(num) (num 是数字的位数,最大200000,线性时间)
额外空间指除输入输出外,程序运行需要的临时空间:
总额外空间复杂度:O(num) (仅用于存储最终的数字字符串)
.
package main
import (
"fmt"
"strings"
)
func maxSumOfSquares(n, sum int)string {
if n*9 < sum {
return""
}
ans := strings.Repeat("9", sum/9)
if sum%9 > 0 {
ans += string('0' + byte(sum%9))
}
return ans + strings.Repeat("0", n-len(ans))
}
func main() {
num := 2
sum := 3
result := maxSumOfSquares(num, sum)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def max_sum_of_squares(n, total_sum):
"""
返回一个长度为n的数字字符串,使得各位数字之和为total_sum,
并且数字的平方和最大(即尽可能把大的数字放在高位)
"""
if n * 9 < total_sum:
return""
# 尽可能多地放置9
ans = "9" * (total_sum // 9)
# 如果还有剩余的和,放在中间
remainder = total_sum % 9
if remainder > 0:
ans += str(remainder)
# 补足剩余的0
ans += "0" * (n - len(ans))
return ans
def main():
num = 2
total_sum = 3
result = max_sum_of_squares(num, total_sum)
print(result)
if __name__ == "__main__":
main()
.
#include <iostream>
#include <string>
std::string maxSumOfSquares(int n, int sum) {
if (n * 9 < sum) {
return"";
}
std::string ans;
// 尽可能多地放置9
ans.append(sum / 9, '9');
// 如果还有剩余的和,放在中间
if (sum % 9 > 0) {
ans += static_cast<char>('0' + sum % 9);
}
// 补足剩余的0
ans.append(n - ans.length(), '0');
return ans;
}
int main() {
int num = 2;
int sum = 3;
std::string result = maxSumOfSquares(num, sum);
std::cout << result << std::endl;
return0;
}

·
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。
·