美文网首页
[leetcode] 357. Count Numbers wi

[leetcode] 357. Count Numbers wi

作者: fasoal2017 | 来源:发表于2017-02-07 15:24 被阅读0次

           这道题的意思呢,是给我们一个整数n,算出大于等于0小于10的n次方的数中各位上不相同的数字的个数,说起来有些绕口哈。

           举个实例:n = 1时,大于0小于10总共10个数(0-9),都满足这个条件,即个数为10

                             n = 2时,在0-99中共有 11,22,33,44,55,66,77,88,99, 9个数不满足条件, 即个数为91

           通用公式:f(k) = 9 * 9 * 8 * ... (9 - k + 2)

           网上关于这道题的解析很多,感觉对通用公式的解释都不够详细,我就主要做下这块的解释。   

           从n=2,开始分析 , 0 - 99 共100个数,分为两种

               ① 位数为1的,0-9 全部符合条件,即十个

               ② 位数为2的,十位数取值范围为1-9共9个,个位数取值范围为0-9共十个但由于不能与十位一致,所有减1,也为9,即9*9 = 81

         此时答案为10+81=91个 

         n=3 一个道理,简单说下分三种情况,前两种情况即为n=2

             ① 位数为1的,0-9 全部符合条件,即十个

             ② 位数为2的,十位数取值范围为1-9共9个,个位数取值范围为0-9共十个但由于不能与十位一致,所有减1,也为9,即9*9 = 81 

            ③位数为3的,百位数取值范围为1-9共9个,十位数取值为9,个位数取值为8

      答案为10+9*9+9*9*8

    最后,分享下我的算法

    public int countNumbersWithUniqueDigits(int n) {     

         if (n == 0) return 1;

         int res = 10;

         int digits = 9;

         for (int i = 9; i >= 11 - n; i--) {

               digits = digits * i;

               res = res + digits;

         }

         return res;

     }

    相关文章

      网友评论

          本文标题:[leetcode] 357. Count Numbers wi

          本文链接:https://www.haomeiwen.com/subject/uqxmittx.html