leetcode_1067
Given an integer d between 0 and 9, and two positive integers low and high as lower and upper bounds, respectively. Return the number of times that d occurs as a digit in all integers between low and high, including the bounds low and high.
Example 1:
Input: d = 1, low = 1, high = 13
Output: 6
Explanation:
The digit d=1 occurs 6 times in 1,10,11,12,13. Note that the digit d=1 occurs twice in the number 11.
Example 2:
Input: d = 3, low = 100, high = 250
Output: 35
Explanation:
The digit d=3 occurs 35 times in 103,113,123,130,131,...,238,239,243.Note:
0 <= d <= 9
1 <= low <= high <= 2×10^8
Solutions
math
This problem is a generalization of
problem 233.The method is the same as in
problem 233except for the case whendequals to0. Since the highest number can not be0, we need to remove these impossible cases.For example:
When counting the number of
0in the second lowest digit,n = 123.Following the rule in
problem 233, the number of 0 in this position is composed of two parts:The main part:
(223 / 100) * 10 = 20ie:01, 02, 03, ... 09 101, 102, 103 ... 109. It's clear that the first10numbers are invalid.The remainder part:
min(223 % 100 - 10 * 0 + 1, 10) = 10, ie:201 202 203 204 205 ... 209.Thus the deduced count offsets the count of invalid numbers in the main part.
class Solution {
public:
long digitsCount(int d, int n) {
long res = 0;
for (long num = 1; num <= n; num *= 10) {
long base = num * 10;
res += (n / base) * num + min(num, max(0l, (n % base) - (num * d) + 1));
if (d == 0)
// remove cases when: 0xxxx in the first part((n / base) * num)
res -= num;
}
return res;
}
int digitsCount(int d, int low, int high) {
return digitsCount(d, high) - digitsCount(d, low - 1);
}
};Last updated
Was this helpful?