Problem
Given an array of digits
, you can write numbers using each digits[i]
as many times as we want. For example, if digits = ['1','3','5']
, we may write numbers such as '13'
, '551'
, and '1351315'
.
Return the number of positive integers that can be generated that are less than or equal to a given integer n
.
Example 1:
1 | Input: digits = ["1","3","5","7"], n = 100 |
Example 2:
1 | Input: digits = ["1","4","9"], n = 1000000000 |
Example 3:
1 | Input: digits = ["7"], n = 8 |
Constraints:
1 <= digits.length <= 9
digits[i].length == 1
digits[i]
is a digit from'1'
to'9'
.- All the values in
digits
are unique. 1 <= n <= 109
Analysis
这是一道构成数字类的题目,题目给定了一个数组,里面是可以利用的数字(可以重复使用),同时给定了一个上界,要求使用题目给出的数字组成出不超过这个上界的数的数量。因为这道题目只需要计算数量,不要求把所有的结果都返回,所以在下面思考的时候也要把这个考虑进去,有可能能简化思路。
我们来看看题目本身,要组成比n
小的数,其实有两种思路:一是位数比n
小,只要位数小,怎么组成都不会超过n
;二是位数相同的,这种情况比较复杂后面再分析。所以第一种其实是非常容易计算的,因为每一位所有数字都可以选,假设有4个数字可选,则x
位数的组合就是$4^x$。如果n
是一个k
位数,那么位数比n
小的数字的总数就是$4 + 4^2 + … + 4^{k - 1}$。
接下来我们来着重分析位数相等的情况。从高位到低位看,分如下几种情况:
n
的第j
位比digits[i]
大:后面的位置数字任意选择,$4^{k-j-1}$n
的第j
位比digits[i]
小:说明已经超过了n
,后面的位置不需要判断了。n
的第j
位和digits[i]
相等:进入下一位的判断。
Solution
按照上面的思路,使用两个循环进行判断,外循环遍历n
的每个位置,内循环遍历可用的数字。特别注意,当n
的某一位所有候选的数字都没有和它相等,则说明不需要进入下一位的判断了,所以可以直接return。
Code
1 | class Solution { |
Summary
这道题目虽然考虑起来会比较复杂,但原理还是数字大小比较,遵循的原则是从高到低。因为这道题目可选数字是可以重复使用的,一定程度上也降低了难度。这道题目的分享到这里,谢谢!