區間內數字計數
假設我們有一個介於 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
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP