欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > leetcode 902. Numbers At Most N Given Digit Set

leetcode 902. Numbers At Most N Given Digit Set

2025/2/6 20:14:12 来源:https://blog.csdn.net/wuyexiaobailong/article/details/141789236  浏览:    关键词:leetcode 902. Numbers At Most N Given Digit Set

题目链接

Given an array of digits which is sorted in non-decreasing order. You can write numbers using each digits[i] as many times as we want. For example, if digits = ['1','3','5'], we may write numbers such as '13''551', and '1351315'.

Return the number of positive integers that can be generated that are less than or equal to a given integer n.

单纯的进制问题,没有0好做多了

以n是一个m位数为举例,如果是k进制,那么位数小于m的数包括,1位k个数,2位k^2 ..... m-1位k^(m-1);  把这些数相加

再计算位数为m的数,看n的当前位上的数s[i]在k个数digits的位置

如果s[i]大于k个数中j个数,那么后面低位排列组合就是:j * k^(当前第几位-1)

s[i] ==digits[j] 刚好在位置上的就计算下一位;

s[i]不在digits中就没必要继续计算了,因为没有边界问题了

class Solution {
public:int atMostNGivenDigitSet(vector<string>& digits, int n) {bool dg[10] = {false}, stl=true;for (auto c : digits) dg[c[0]-'0'] = true;long dp[11] = {0},dlen = digits.size(), rst = 0, cl;dp[0] =1;for (int i = 1 ; i < 11; i++) dp[i] = dlen*dp[i-1];auto s = to_string(n);int slen = s.size();for (int i = 0 ; i< slen; i++) {rst += dp[slen -i -1];if (stl) {cl = 0;for (int j = 0; j< s[i]- '0'; j++) if (dg[j]) cl++;if (i==slen-1 && dg[s[i]-'0']) cl++;rst += dp[slen -i -1] *cl;if(!dg[s[i]-'0']) stl = false;}}return rst-1;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com