leetcode习题整理——动态规划篇——lc357 Count Numbers with Unique Digits

357Count Numbers with Unique Digits

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

Example:
Given n = 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding [11,22,33,44,55,66,77,88,99])


题目要求: 找出0到10的n次方中所有unique的数(既该数的所有位数无重复数组),如123为为unique,122不为unique,因为后两位2重复出现。

其实这个题的思路还是蛮简单的,回想下最简单的排列组合的知识。如找出所有十位unique digits number, 那么我们在十位可取1-9这九个数字,在个位能取除十位的数字外剩下的数字,由于个位可取0,所以个位还是可以取9个数字,则十位数的unique number为9*9 = 81。同理, 所有百位数unique digits number为9*9*8=648, 以此类推。

由于此题目要求返回0到10的n次方中所有的unique number个数,因此我们可以分别求出个,十,百...每个位数上分别对应的unique number个数,然后加起来就好了。(这么一说感觉和动态规划也没什么关系2333)

代码实现如下:


    public int countNumbersWithUniqueDigits(int n) {
        if (n < 0) {
            return 0;
        }
        if (n == 0) {
            return 1;
        }
        int result = 1;
        for(int i = 1; i <= n; i++){
            int count = 9;
            int mult = 9;
            int cur = i;
            while (cur > 1) {
                count *= mult;
                mult--;
                cur--;
            }
            result += count;
        }
        return result;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值