We have a sorted set of digits `D`, a non-empty subset of `{'1','2','3','4','5','6','7','8','9'}`.  (Note that `'0'` is not included.)

Now, we write numbers using these digits, using each digit as many times as we want.  For example, if D = {'1','3','5'}, we may write numbers such as '13', '551', '1351315'.

Return the number of positive integers that can be written (using the digits of D) that are less than or equal to N.

Example 1:

Input: D = ["1","3","5","7"], N = 100
Output: 20
Explanation:
The 20 numbers that can be written are:
1, 3, 5, 7, 11, 13, 15, 17, 31, 33, 35, 37, 51, 53, 55, 57, 71, 73, 75, 77.

Example 2:

Input: D = ["1","4","9"], N = 1000000000
Output: 29523
Explanation:
We can write 3 one digit numbers, 9 two digit numbers, 27 three digit numbers,
81 four digit numbers, 243 five digit numbers, 729 six digit numbers,
2187 seven digit numbers, 6561 eight digit numbers, and 19683 nine digit numbers.
In total, this is 29523 integers that can be written using the digits of D.

Note:

  1. D is a subset of digits '1'-'9' in sorted order.
  2. 1 <= N <= 10^9

这道题给了我们一个有序字符串数组,里面是0到9之间的数(这里博主就纳闷了,既然只有一位数字,为啥不用 char 型,而要用 string 型),然后又给了一个整型数字N,问无限制次数使用D中的任意个数字,能组成多个不同的小于等于D的数字。先来分析例子1,当N为 100 时,所有的一位数和两位数都是可以的,既然可以重复使用数字,假设总共有n个数字,那么对于两位数来说,十位上和个位上分别都有n种可能,总共就是 n^2 种可能,对于一位数来说,总共n种可能。那么看到这里就可以归纳出当N总共有 len 位的话,我们就可以快速的求出不超过 len-1 位的所有情况综合,用个 for 循环,累加n的指数即可。然后就要来分析和数字N位数相等的组合,题目中的两个的例子的N都是1开始的,实际上N可以是任何数字,举个例子来说吧,假如 D={"1","3","5","7"},N=365,那么根据前面的分析,我们可以很快的算出所有的两位数和一位数的组合情况总数 4 + 4^2 = 20 个。现在要来分析三位数都有哪些组合,由于D数组是有序的,所以我们从开头遍历的话先取到的就是最小的,这时候有三种情况,小于,等于,和大于,每种的处理情况都有些许不同,这里就拿上面提到的例子进行一步一步的分析:

  • 对于N的百位数字3来说,D中的1小于N中的百位上的3,那么此时百位上固定为1,十位和个位上就可以是任意值了,即 1xx,共有 4^2 = 16 个。
  • 对于N的百位数字3来说,D中的3等于N中的百位上的3,那么此时百位上固定为3,十位和个位的值还是不确定,此时就不能再继续遍历D中的数字了,因为之后的数字肯定大于3,但是我们可以继续尝试N的下一位。
  • 对于N的十位数字6来说,D中的1小于N中的十位上的6,那么百位和十位分别固定为3和1,个位上就可以是任意值了,即 31x,共有 4 个。
  • 对于N的十位数字6来说,D中的3小于N中的十位上的6,那么百位和十位分别固定为3和3,个位上就可以是任意值了,即 33x,共有 4 个。
  • 对于N的十位数字6来说,D中的5小于N中的十位上的6,那么百位和十位分别固定为3和5,个位上就可以是任意值了,即 35x,共有 4 个。
  • 对于N的十位数字6来说,D中的7大于N中的十位上的6,此时再也组不成小于N的数字了,直接返回最终的 20+16+4+4+4=48 个。

代码如下:

class Solution {
public:
int atMostNGivenDigitSet(vector<string>& D, int N) {
string str = to_string(N);
int res = 0, n = D.size(), len = str.size();
for (int i = 1; i < len; ++i) res += pow(n, i);
for (int i = 0; i < len; ++i) {
bool hasSameNum = false;
for (string &d : D) {
if (d[0] < str[i]) res += pow(n, len - 1 - i);
else if (d[0] == str[i]) hasSameNum = true;
}
if (!hasSameNum) return res;
}
return res + 1;
}
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/902

参考资料:

https://leetcode.com/problems/numbers-at-most-n-given-digit-set/

https://leetcode.com/problems/numbers-at-most-n-given-digit-set/discuss/225123/c%2B%2B100

https://leetcode.com/problems/numbers-at-most-n-given-digit-set/discuss/168439/C%2B%2B-O(logN)-Clear-code-with-explanation

[LeetCode All in One 题目讲解汇总(持续更新中...)](https://www.cnblogs.com/grandyang/p/4606334.html)

[LeetCode] 902. Numbers At Most N Given Digit Set 最大为 N 的数字组合的更多相关文章

  1. LeetCode 902. Numbers At Most N Given Digit Set

    应该是常数 N的位数时间级别 我的这个方法超时很严重...但是特此记录 费劲巴拉写的... 超时: int atMostNGivenDigitSet(char** D, int DSize, int ...

  2. 902. Numbers At Most N Given Digit Set

    We have a sorted set of digits D, a non-empty subset of {'1','2','3','4','5','6','7','8','9'}.  (Not ...

  3. [Swift]LeetCode902. 最大为 N 的数字组合 | Numbers At Most N Given Digit Set

    We have a sorted set of digits D, a non-empty subset of {'1','2','3','4','5','6','7','8','9'}.  (Not ...

  4. [LeetCode] Count Numbers with Unique Digits 计算各位不相同的数字个数

    Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...

  5. [LeetCode] Consecutive Numbers 连续的数字

    Write a SQL query to find all numbers that appear at least three times consecutively. +----+-----+ | ...

  6. Leetcode: Count Numbers with Unique Digits

    Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...

  7. [LeetCode] Consecutive Numbers 连续的数字 --数据库知识(mysql)

    1. 题目名称   Consecutive Numbers 2 .题目地址 https://leetcode.com/problems/consecutive-numbers/ 3. 题目内容 写一个 ...

  8. LeetCode902. Numbers At Most N Given Digit Set

    题目: We have a sorted set of digits D, a non-empty subset of {'1','2','3','4','5','6','7','8','9'}.  ...

  9. [LeetCode] Lexicographical Numbers 字典顺序的数字

    Given an integer n, return 1 - n in lexicographical order. For example, given 13, return: [1,10,11,1 ...

随机推荐

  1. 一、Spring注解之@ComponentScan

    Spring注解之@ComponentScan [1]@ComponentScan注解是什么 @ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bea ...

  2. github clone加速

    1. 在https://asm.ca.com/zh_cn/ping.php 网址中查询 github.global.ssl.fastly.net 及 github.com 的 china地区 avr ...

  3. 奥展项目笔记05--域名、端口、Nginx相关知识笔记

    1.我国的电信运营商是默认封闭80端口的. 中国电信屏蔽ADSL用户80端口 只是做应用服务器的话你可以使用别的端口. 80端口电脑上同时有各种各样的程序在运行,他们都需要借助网络来进行通信.例如,你 ...

  4. Logstash:多个配置文件(conf)

    Logstash:多个配置文件(conf) 对于多个配置的处理方法,有多个处理方法: 多个pipeline 一个pipleline处理多个配置文件 一个pipeline含有一个逻辑的数据流,它从inp ...

  5. 排障利器之远程调试与监控 --jmx & remote debug

    监控和调试功能是应用必备的属性之一,其手段也是多种多样. 一般地,我们可以通过:线上日志, zabbix, grafana, cat 等待系统做一问题留底,有问题及时报警,从而达到监控效果. 而对于应 ...

  6. CefSharp F12打开DevTools查看console js和c#方法互相调用

    转载地址: https://www.cnblogs.com/lonelyxmas/p/11010018.html winform嵌入chrome浏览器,修改项目属性 生成 平台为x86 1.nuget ...

  7. python with语句与contextlib

    参考链接:https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/ with语句用于异常处理,适用于存在资源访问的场合,无论 ...

  8. MyBatis面试题集合,90%会遇到这些问题

    1.#{}和${}的区别是什么? ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc. ...

  9. SSM登陆

    简单的SSM登陆 jsp <form action="${pageContext.request.contextPath }/user/login.action"> & ...

  10. head中的base标签:设置超链接的默认行为

    默认情况下,如果不指定超链接的target属性,则在当前窗口打开.使用head中的base可以制定超链接的base类,一切超链接都会继承它的属性. <html> <head> ...