902. 最大为 N 的数字组合

代码实现
class Solution {
private:
int solve(stack<int>& st, vector<int>& digits) {
if (st.empty()) return 0;
int tmp = st.top();
st.pop();
int pos = lower_bound(digits.begin(), digits.end(), tmp) - digits.begin();
if (pos < digits.size() && digits[pos] == tmp) {
if (st.empty()) return pos + 1;
return pos * int(pow(digits.size(), st.size())) + solve(st, digits);
}
return pos * int(pow(digits.size(), st.size()));
}
public:
int atMostNGivenDigitSet(vector<string>& digits, int n) {
int ans = 0;
int sz = digits.size();
int i = 1;
for (long long k = 1; k * 10 <= n; k *= 10) {
ans += int(pow(sz, i));
i++;
}
int tmp = n;
sort(digits.begin(), digits.end());
vector<int> digits_new;
for (auto digit : digits) {
digits_new.push_back(digit[0] - '0');
}
stack<int> st;
while (tmp) {
int digit = tmp % 10;
st.push(digit);
tmp /= 10;
}
return ans + solve(st, digits_new);
}
};