区间内数字计数
假设我们有一个介于 0 和 9 之间的整数 d,我们还有两个正整数 low 和 high 分别作为下界和上界。我们必须找到在 low 和 high 之间(包括 low 和 high)的所有整数中,数字 d 作为数字出现的次数。
因此,如果输入类似于 d = 1,low = 1,high = 13,则输出将为 6,因为数字 d=1 出现了 6 次,例如 1, 10, 11, 12, 13。
为了解决这个问题,我们将遵循以下步骤:
定义一个函数 zero(),它将接收 n,
ret := 0, x := 0
如果 n 等于 0,则:
返回 1
对于初始化 m := 1,当 m <= n 时,更新 m := m * 10,执行:
a := n / m
b := n mod m
z := a mod 10
如果 m 的位数与 n 的位数相同,则:
退出循环
如果 z > x,则:
ret := ret + ((a / 10) + 1)
否则,如果 z 等于 x,则
ret := ret + ((a / 10) * m + (b + 1))
否则
ret := ret + (a / 10)
返回 ret
定义一个函数 f(),它将接收 x, n,
ret := 0
对于初始化 m := 1,当 m <= n 时,更新 m := m * 10,执行:
a := n / m
b := n mod m
z := a mod 10
如果 z > x,则
ret := ret + ((a / 10) + 1)
否则,如果 z 等于 x,则:
ret := ret + ((a / 10) * m + (b + 1))
否则
ret := ret + (a / 10)
如果 x 等于 0,则:
ret := ret - m
返回 ret
从主方法执行以下操作
返回 ret
返回 f(d, high - f(d, low - 1))
让我们看看下面的实现以更好地理解:
示例
#include <bits/stdc++.h> using namespace std; class Solution { public: int digitCount(int x){ int ret = 0; while (x) { ret++; x /= 10; } return ret; } int zero(int n){ int ret = 0; int x = 0; if (n == 0) return 1; for (int m = 1; m <= n; m *= 10) { int a = n / m; int b = n % m; int z = a % 10; if (digitCount(m) == digitCount(n)) break; if (z > x) { ret += ((a / 10) + 1) * m; } else if (z == x) { ret += (a / 10) * m + (b + 1); } else { ret += (a / 10) * m; } cout << ret << endl; } return ret; } int f(int x, int n){ int ret = 0; for (int m = 1; m <= n; m *= 10) { int a = n / m; int b = n % m; int z = a % 10; if (z > x) { ret += ((a / 10) + 1) * m; } else if (z == x) { ret += (a / 10) * m + (b + 1); } else { ret += (a / 10) * m; } if (x == 0) { ret -= m; } } return ret; } int digitsCount(int d, int low, int high){ return f(d, high) - f(d, low - 1); } }; main(){ Solution ob; cout << (ob.digitsCount(1,1,13)); }
输入
1,1,13
输出
6