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. tomcat正常运行一段时间后,突然访问不了项目了

    前言 我将项目部署在tomcat服务器上,本来都是好好的,输入网站地址就能访问:但是第二天一早去就会发现网站访问提示404,文件无法找到:我就很懵了. 排查 1.我是用的是chrome浏览器,所以尝试 ...

  2. oracle简单查询单词

    单词 释义 select 查询 from 从... where 条件查询 as 别名 not 取反 and 和 or 或者 between...and... 范围取值,包含边界 like 模糊查询 e ...

  3. 简述vue props和非props的2个特性

    props的2个特性 ①:父组件通过属性的方式传值(比如下面截图中的content)给子组件,content不会显示在DOM节点中                       ②:父组件向子组件传递值 ...

  4. python操作时间

    一.问题背景 在对数据进行操作的时候我们总是会遇到数据类型是date类型的数据,这种数据会让我们在使用和操作的过程中遇到一些问题,比如int类型和date类型不对等,string类型和date类型不对 ...

  5. 【题解】Informacije [COCI2012]

    [题解]Informacije [COCI2012] 传送门:官方题面 [题目描述] 有一个长度为 \(n\) 的 序列 \(a\)(由 \([1,n]\) 中的数组成,且每个数只会出现一次),现给出 ...

  6. tsconfig.json配置项详解

    { "compilerOptions": { "allowUnreachableCode": true, // 不报告执行不到的代码错误. "allo ...

  7. ASP.NET中的请求验证

    这两天做项目的时候偶然发现项目中的保存功能的时候出现这样的异常:异常详细信息: System.Web.HttpRequestValidationException: 从客户端(XXXX)中检测到有潜在 ...

  8. AutoLayout的使用

    虽然苹果提供了AutoresizingMask的布局方式,这个方式局限性太大:只能解决父控件和子控件间的相对关系: 因此,推出了AutoLayout:苹果官方也是推荐开发者尽量使用autolayout ...

  9. jmeter中websocket接口测试

    一.Websocket协议简介 Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说: HTTP协议: HTTP的生命周期通过 Request 来界定,也就是一个 Request  ...

  10. 通过premake生成vs工程文件

    visual studio的工程视图,在引用外部目录时非常麻烦,这时候可以使用premake一键生成工程文件,自动配置好工程的各种属性,还有目录的组织结构. 示例:如下是一个c++的外部目录结构,我们 ...