[leetcode] 357. Count Numbers wi

2017-02-07  本文已影响0人  fasoal2017

       这道题的意思呢,是给我们一个整数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;

 }

上一篇下一篇

猜你喜欢

热点阅读