
题目描述
给你两个非负整数 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)\)。
| 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;
}
};
|
| 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;
}
|