C ++中最多N个给定数字集的数字

假设我们有一组数字D,{{1,'2','3','4','5','6','7','8',' 9'}除0外。现在,我们将使用这些数字写一些数字,并根据需要使用每个数字多次。因此,如果D = {'2','3','7'},我们可以写数字,例如'23','771','2372327'。

现在我们必须找到可以写入的小于或等于N的正整数的数量。

因此,如果输入像D = [2,3,4,7],N = 100,那么输出将是20,因为数字可以是2、3、4、7、22、23、24、27 ,32、33、34、37、42、43、44、47、72、73、74、77。所有其他数字均大于100。

为了解决这个问题,我们将遵循以下步骤-

  • n:=将N转换为字符串

  • sz:= n的大小,ret:= 0

  • 对于初始化i:= 1,当i <sz时,更新(将i增加1),-

    • ret:= ret +(D的大小)^ i

  • 对于初始化i:= 0,当i <sz时,更新(将i增加1),执行-

    • 返回ret

    • 如果x [0] <n [i],则-

    • 否则,当x [0]与n [i]相同时,则-

    • ret:= ret +(D的大小)^(sz-i-1)

    • hasSameNum:= true

    • hasSameNum:=否

    • 对于D中的每个字符串x-

    • 如果不是hasSameNum为非零,则-

    • 返回ret + 1

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
       public:
       int atMostNGivenDigitSet(vector<string> &D, int N) {
          string n = to_string(N);
          int sz = n.size();
          int ret = 0;
          for (int i = 1; i < sz; i++) {
             ret += pow(D.size(), i);
          }
          for (int i = 0; i < sz; i++) {
             bool hasSameNum = false;
             for (string &x : D) {
                if (x[0] < n[i]) {
                   ret += pow(D.size(), sz - i - 1);
                } else if (x[0] == n[i]) {
                   hasSameNum = true;
                }
             }
             if (!hasSameNum)
             return ret;
          }
          return ret + 1;
       }
    };
    main(){
       Solution ob;
       vector<string> v = {"2","3","4","7",};
       cout << (ob.atMostNGivenDigitSet(v, 100));
    }

    输入值

    {"2","3","4","7"}, 100

    输出结果

    20