17.06. Number Of 2s In Range
Description
Write a method to count the number of 2s that appear in all the numbers between 0 and n (inclusive).
Example:
Input: 25 Output: 9 Explanation: (2, 12, 20, 21, 22, 23, 24, 25)(Note that 22 counts for two 2s.)
Note:
n <= 10^9
Solutions
Solution 1: Digit DP
This problem is essentially about finding the number of occurrences of the digit \(2\) in the given interval \([l,..r]\). The count is related to the number of digits and the digit at each position. We can use the idea of Digit DP to solve this problem. In Digit DP, the size of the number has little impact on the complexity.
For the interval \([l,..r]\), we usually transform it into \([1,..r]\) and then subtract \([1,..l - 1]\), i.e.,
However, for this problem, we only need to find the value in the interval \([1,..r]\).
Here, we use memoization to implement Digit DP. We start from the top and search down to the bottom to get the number of schemes, then return the answer layer by layer and accumulate it, finally getting the final answer from the starting point of the search.
The basic steps are as follows:
- Convert the number \(n\) into an int array \(a\), where \(a[1]\) is the least significant digit, and \(a[len]\) is the most significant digit.
- Design the function \(dfs()\) based on the problem information. For this problem, we define \(dfs(pos, cnt, limit)\), and the answer is \(dfs(len, 0, true)\).
Where:
posrepresents the number of digits, starting from the least significant digit or the first digit, usually depending on the digit construction property of the problem. For this problem, we choose to start from the most significant digit, so the initial value ofposislen.cntrepresents the number of \(2\)s in the current number.limitrepresents the restriction on the digits that can be filled. If there is no restriction, you can choose \([0,1,..9]\), otherwise, you can only choose \([0,..a[pos]]\). Iflimitistrueand the maximum value has been reached, then the nextlimitis alsotrue. Iflimitistruebut the maximum value has not been reached, or iflimitisfalse, then the nextlimitisfalse.
For details on the implementation of the function, please refer to the code below.
The time complexity is \(O(\log n)\).
Similar problems:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |