跳转至

4000. 给定数位和的最大整数

题目描述

给你两个非负整数 ns

返回满足下述条件的 最大 整数:

  • 最多有 n 位数字。
  • 其各位数字之和等于 s 。

如果不存在这样的整数,则返回 -1

 

示例 1:

输入: n = 2, s = 9

输出: 90

解释:

最多由 2 位数字组成且各位数字之和为 9 的最大整数是 90。

示例 2:

输入: n = 2, s = 19

输出: -1

解释:

不存在最多由 2 位数字组成且各位数字之和为 19 的整数,因此答案为 -1

示例 3:

输入: n = 5, s = 0

输出: 0

解释:

唯一一个各位数字之和为 0 的非负整数是 0。

 

提示:

  • 1 <= n <= 5
  • 0 <= s <= 100

解法

方法一:贪心

\(n \times 9 < s\),即使每一位都取 \(9\) 也无法凑出数位和 \(s\),返回 \(-1\)

否则,为使整数尽可能大,应优先让高位取尽可能大的数字。从高位到低位共构造 \(n\) 位:每一位取 \(\min(s, 9)\),并令 \(s\) 减去该值。最终得到的整数即为答案(若 \(s = 0\),结果为 \(0\))。

时间复杂度 \(O(n)\),空间复杂度 \(O(1)\)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Solution:
    def largestInteger(self, n: int, s: int) -> int:
        if n * 9 < s:
            return -1
        ans = 0
        for _ in range(n):
            x = min(s, 9)
            ans = ans * 10 + x
            s -= x
        return ans
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Solution {
    public int largestInteger(int n, int s) {
        if (n * 9 < s) {
            return -1;
        }
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            int x = Math.min(s, 9);
            ans = ans * 10 + x;
            s -= x;
        }
        return ans;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Solution {
public:
    int largestInteger(int n, int s) {
        if (n * 9 < s) {
            return -1;
        }
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            int x = min(s, 9);
            ans = ans * 10 + x;
            s -= x;
        }
        return ans;
    }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func largestInteger(n int, s int) (ans int) {
    if n*9 < s {
        return -1
    }
    for i := 0; i < n; i++ {
        x := min(s, 9)
        ans = ans*10 + x
        s -= x
    }
    return
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
function largestInteger(n: number, s: number): number {
    if (n * 9 < s) {
        return -1;
    }
    let ans = 0;
    for (let i = 0; i < n; ++i) {
        const x = Math.min(s, 9);
        ans = ans * 10 + x;
        s -= x;
    }
    return ans;
}

评论