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. css样式重置 移动端适配

    css  默认样式重置 @charset "utf-8"; *{margin:0;padding:0;} img {border:none; display:block;} em, ...

  2. redis之线程IO模型

    非阻塞 IO 当我们调用套接字的读写方法,默认它们是阻塞的,比如 read 方法要传递进去一个参数n,表示读取这么多字节后再返回,如果没有读够线程就会卡在那里,直到新的数据到来或者连接关闭了,read ...

  3. 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解【转】

    Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从Extension Manager里安装:最新版本是19号发布的2.5版 然后重启你的VS开发环境 ...

  4. 基于MicroPython结合ESP8266模块实现TCP通信(AT指令版)

    转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 实验目的 - 学习ESP8266模块(ESP-01) ...

  5. CentOS系统安装Python3

    准备: CentOS 6.4系统 Python-3.6.5.tgz 下载地址: 官网:https://www.python.org/downloads/release/python-365/ 镜像:h ...

  6. javascript:警告(alert 消息对话框),确认(confirm 消息对话框)

    原文:https://blog.csdn.net/u012110719/article/details/41926315

  7. tf.argmax()解析

    tf.argmax(input,axis)根据axis取值的不同返回每行或者每列最大值的索引. 代码如下: import tensorflow as tfimport numpy as npsess= ...

  8. Ext中statics()与self

    var self = this; var statics = self.statics();//所在类的静态成员(instance.statics():跟着所在类走,在哪个类中,就返回哪个类中的静态成 ...

  9. html 实体编码转换成原字符

    今天遇到件很恶心的事,某国外歌词网站提供的歌词在源文件里使用“&#数字;”格式的编码表示abcd....原来小菜我实在才疏学浅不知此为何物,于是特有的搜索引擎控,搜之.片刻得解,此乃html实 ...

  10. Ubuntu 18.04通过命令禁用/开启触控板

    Ubuntu下经常遇到无法用快捷键关闭触控板的情况,博主的电脑安装Ubuntu18.04后便出现了该问题. 解决办法: 首先查看输入设备的id,命令行输入: xinput ,插鼠标与不插鼠标时,Tou ...