leetcode_middle_13_357. Count Numbers with Unique Digits

题意:

给定一个整数,返回0到10的n次方中每个位都不等的数的个数。


分析:
即我们要找出存在相等位的数的个数(比如1234567891)有两个1。我们发现这样的数1位数有10个(0到9)。2位数是有9*9个(第一位即十位有9种选择(1-9),第二位有0-9除去第一位已经确定的有9种,所以总共9*9=81种)。依次类推,按照排列组合的思想,3位数是9*9*8个,4位数是9*9*8*7个,直到10位数及以上是0,因为0-9九个数字必定有重复。

我们来考虑一般规律和特殊情况:

特殊情况1:n == 0的时候返回1.后面发现正好是count的初始值,直接返回即可,所以不用特殊处理。

特殊情况2:n>=10的时候阶段性的和是0,考虑在循环中到0的时候处理

特殊情况3:9*9*8,9乘了一次9才变成8,考虑在循环中到9的时候处理

public class Solution {
    public int countNumbersWithUniqueDigits(int n) {
        int count = 1;
        int m = 9;  //排列组合的每一位的排法
        int t = 1;  //每n位数的阶段性的和
 
        while(n > 0){
            t *=  m;
            count += t;
            n--;
            if(t != 9 && t!=0)  //对特殊情况2,3的处理
                m--;
        }
        return count;
    }
}

 




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值