Leetcode力扣秋招刷题路-0902

这篇具有很好参考价值的文章主要介绍了Leetcode力扣秋招刷题路-0902。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结

902. 最大为 N 的数字组合

给定一个按 非递减顺序 排列的数字数组 digits 。你可以用任意次数 digits[i] 来写的数字。例如,如果 digits = [‘1’,‘3’,‘5’],我们可以写数字,如 ‘13’, ‘551’, 和 ‘1351315’。

返回 可以生成的小于或等于给定整数 n 的正整数的个数 。

示例 1:
输入:digits = [“1”,“3”,“5”,“7”], n = 100
输出:20
解释:
可写出的 20 个数字是:
1, 3, 5, 7, 11, 13, 15, 17, 31, 33, 35, 37, 51, 53, 55, 57, 71, 73, 75, 77.

示例 2:
输入:digits = [“1”,“4”,“9”], n = 1000000000
输出:29523
解释:
我们可以写 3 个一位数字,9 个两位数字,27 个三位数字,
81 个四位数字,243 个五位数字,729 个六位数字,
2187 个七位数字,6561 个八位数字和 19683 个九位数字。
总共,可以使用D中的数字写出 29523 个整数。

示例 3:
输入:digits = [“7”], n = 8
输出:1

提示:
1 <= digits.length <= 9
digits[i].length == 1
digits[i] 是从 ‘1’ 到 ‘9’ 的数
digits 中的所有值都 不同
digits 按 非递减顺序 排列
1 <= n <= 1 0 9 10^9 109

解题思路
一眼看过去,数学题,排列组合嘛。

老样子先自己构造两个测试数据: D = [“3”,“4”,“6”,“7”] N = 75134

Leetcode力扣秋招刷题路-0902

很显然,对于一个 5 位数的 N 来说,所有 4/3/2/1 位数的数字都一定小于它

Leetcode力扣秋招刷题路-0902

这也是最好计算的部分,每一位都有 4 个数字可以选择,也就是分别有 4⁴ , 4³ , 4² , 4¹ 种情况。

而 5 位数的情况,就相对复杂了许多,需要多考虑点了:

Leetcode力扣秋招刷题路-0902

如上图所示,5 位数的话,假如第一位比 7 小,那么后面四位其实就没所谓大小了。

此时组合的数量就是 第一位的情况数量 f(7) * 4⁴,后四位的情况,恰好对应了只有四位数的时候。

但是如果第一位恰好等于 7 呢?那就只能要求第二位小于 5 了,最后那三位可以随意。

以此类推,直到五位数每一位都等于相应的数字,那就只有一种情况了。

图中在每一种组合后面,标注了相应的数量。

但是,仔细观察一下我们提供的数组 D ,里面压根没有 5, 1这两个数字啊:

Leetcode力扣秋招刷题路-0902

如上图所示,红色表示并不存在的数字,可以看到由于 5的影响,其实后面的几种情况已经全都不用计算了,压根不会出现。

那么思路就已经比较清晰了,和目标数字相等长度的数字需要遍历查找,其它数字可以直接计算得出来。

代码文章来源地址https://www.toymoban.com/news/detail-433984.html

class Solution {
    public int atMostNGivenDigitSet(String[] D, int N) {
        int ans = 0;
        
		// 对 D 数组进行预处理
        int[] less_than_d = new int[10];
        int[] d_arr = new int[10];
        for (int i = 0; i < D.length; i++) {
            Arrays.fill(less_than_d, Integer.parseInt(D[i]) + 1, 10, i + 1);
            d_arr[Integer.parseInt(D[i])] = 1;
        }

        // 一位数的 N 可以直接返回
        if (N / 10 == 0)
            return less_than_d[N] + d_arr[N];

        // 将 N 打平存入数组
        int n_len = 0;
        int[] n_arr = new int[10];
        while (N != 0) {
            n_arr[n_len] = N % 10;
            n_len += 1;
            N = N / 10;
        }

        // 把各种幂算出来备用,n_pow[2] 里存的是平方
        int[] n_pow = new int[n_len];
        n_pow[0] = 1;
        for (int i = 1; i < n_len; i++)
            ans += (n_pow[i] = D.length * n_pow[i - 1]);

        // 将所有可能性加起来
        ans += less_than_d[n_arr[n_len - 1]] * n_pow[n_len - 1];
        for (int i = n_len - 1; i >= 0; i--)
            if (d_arr[n_arr[i]] == 1)
                ans = i == 0 ? ans + 1 : ans + less_than_d[n_arr[i - 1]] * n_pow[i - 1];
            else
                break;


        return ans;
    }
}

到了这里,关于Leetcode力扣秋招刷题路-0902的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode力扣秋招刷题路-0854

    从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 对于某些非负整数 k ,如果交换 s1 中两个字母的位置恰好 k 次,能够使结果字符串等于 s2 ,则认为字符串 s1 和 s2 的 相似度为 k 。 给你两个字母异位词 s1 和 s2 ,返回 s1 和 s2 的相似度 k 的最小值。 示例

    2024年02月02日
    浏览(41)
  • Leetcode力扣秋招刷题路-0399

    从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。 另有一些以数组 queries 表

    2023年04月22日
    浏览(25)
  • 07 Linux补充|秋招刷题|9月6日

    Linux 结构体内存字节对齐 静态变量static 空指针 结构体内存字节要对⻬: 32位系统:4 8 32;64位系统:8 16 24 字节对⻬:字节对⻬是指在计算机中,各种类型数据按照⼀定的规则在空间上排列,以满⾜硬件平台对存储空间的处理要求。 (1)在修饰变量的时候,static 修饰的静

    2024年02月09日
    浏览(28)
  • 从零开始的力扣刷题记录-第四十天

    题目描述: 给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。 题解: 其实和二进制转换是一样的,除以7取余再倒序取出结果就可以了 代码(Go): 题目描述: 给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 t

    2024年02月06日
    浏览(29)
  • 从零开始的力扣刷题记录-第四十二天

    题目描述: 给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。 如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。

    2024年02月06日
    浏览(42)
  • 从零开始的力扣刷题记录-第八十七天

    题目描述: 给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径 1 - 2 - 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和 。 叶节点 是指没有子节点的节点

    2024年02月07日
    浏览(33)
  • 从零开始的力扣刷题记录-第五十八天

    题目描述: 给你一个 不包含 任何零的整数数组 nums ,找出自身与对应的负数都在数组中存在的最大正整数 k 。 返回正整数 k ,如果不存在这样的整数,返回 -1 。 题解: 哈希表存储负数,再遍历nums对每一个正数去哈希表中查找是否存在对应的负数。存在就更新返回值 代码

    2024年02月09日
    浏览(37)
  • 从零开始的力扣刷题记录-第四十八天

    给你一个下标从 0 开始的数组 nums ,数组大小为 n ,且由 非负 整数组成。 你需要对数组执行 n - 1 步操作,其中第 i 步操作(从 0 开始计数)要求对 nums 中第 i 个元素执行下述指令: 如果 nums[i] == nums[i + 1] ,则 nums[i] 的值变成原来的 2 倍,nums[i + 1] 的值变成 0 。否则,跳过

    2024年02月09日
    浏览(38)
  • 从零开始的力扣刷题记录-第三十九天

    题目描述: 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b] 应该按如下格式输

    2024年02月06日
    浏览(33)
  • 从零开始的力扣刷题记录-第六十二天

    题目描述: 给你一个非负整数数组 nums 。在一步操作中,你必须: 选出一个正整数 x ,x 需要小于或等于 nums 中 最小 的 非零 元素。 nums 中的每个正整数都减去 x。 返回使 nums 中所有元素都等于 0 需要的 最少 操作数。 题解: 由于每次都要减去一个最小的非零元素,可以想

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包