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