區間內數字計數


假設我們有一個介於 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

更新於:2020年7月11日

916 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告