leecode 解题总结:357. Count Numbers with Unique Digits

来源:互联网 发布:iptv网络电视 apk 编辑:程序博客网 时间:2024/06/14 13:34
#include <iostream>#include <stdio.h>#include <vector>#include <string>using namespace std;/*问题: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])分析:给定一个非负整数n,输出0到10^n有多少非唯一的数字组成的数的个数,该整数是n位数。举例:n=2,就是11,22,33,44,55,66,77,88,99 是唯一的数字组成,需要排除,10^2 - 9 = 91n=3,就是,11,22,33,44,55,66,77,88,99,111,222,333,...,999     不对:112,这种也需要排除 等于是{11,22,33,44,55,66,77,88,99} 与 {0,1,2...,9}的组合的也需要排除 我们先计算: 1】 {11,22,33,44,55,66,77,88,99} 与 {1,2...,9}重复的个数 以1为例1和11本身只计数1个, 1和22,由于1可以插入在22中3个位置,形成122,212,221,所有共有3个, 共计:1 + 8 * 3 = 25 同理其他8个数也是这样,所以{1,2...,9}与{11,22,33,44,55,66,77,88,99}  组成的3位数中计数=9 * 25 = 225 2】 来看0,以11为例,头部不可以插入,有2个位置101,110, 所以共计=2 * 9 = 18 所以n=3时,3位数中存在某些位相同的总共是计数=9 * (1 + 8 * 3) + 2 * 9 总结规律:n=3,3位数计数=9*(1 + 8 * n) + (n-1) * 9           n=2,2位数计数=9   n=4,4位数计数=9*(1 + 8 * n) + (n-1) * 9。   不对存在: 1213什么的也是重复,可以在   121中插入{1,9}所以当n=2时,总的计数=9当n > 2时,计数1= 累加和(  9*(1 + 8 * i) + (i-1) * 9 ),i属于3到n           总的计数=9 + 计数1最后再拿10^n - 总的计数即可参考leecode提示:This problem can also be solved using a dynamic programming approach and some knowledge of combinatorics.Let f(k) = count of numbers with unique digits with length equals k.f(1) = 10, ..., f(k) = 9 * 9 * 8 * ... (9 - k + 2) [The first factor is 9 because a number cannot start with 0].直接统计存在相同位的数字太麻烦,因此直接统计不同的数字。根据排列问题,设f(i)表示长度为i的所有数字中各个位都不同的数字个数那么作为每个数的最高位:可以从{1,2,..,9}中任意选择一个,记为i,有9种,次最高位可以从{0,1,2...,9}中选择除了i之外剩余9个【易错】,则f(1)=10,f(2)=9*9总结f(1)=10;k >= 2时,f(k)=9 * 9 * 8* ..*(9-k+2),k最多为10,如果k为11,11位数必定有位数重复k >= 11,f(k)=0然后把f(1)+f(2)+...+f(k)累加起来输入:0123输出:1091739关键:1直接统计存在相同位的数字太麻烦,因此直接统计不同的数字。设f(i)表示长度为i的所有数字中各个位都不同的数字个数那么作为每个数的最高位:可以从{1,2,..,9}中任意选择一个,记为i,有9种,次最高位可以从{0,1,2...,9}中选择除了i之外剩余9个【易错】,则f(1)=10,f(2)=9*9总结f(1)=10;k >= 2时,f(k)=9 * 9 * 8* ..*(9-k+2),k最多为10,如果k为11,11位数必定有位数重复k >= 11,f(k)=0然后把f(1)+f(2)+...+f(k)累加起来2 易错,统计0~10^n,若为0,1必定是*/class Solution {public:    int countNumbersWithUniqueDigits(int n) {if(n < 0){return 0;}//易错,统计0~10^n,若为0,1必定是if(0 == n){return 1;}        vector<int> dp(n + 1 , 0);dp.at(1) = 10;int temp = 1;int result = dp.at(1);for(int i = 2 ; i <= n ; i++){if(9 - i + 2 >= 1){temp *= (9 - i + 2);dp.at(i) = 9 * temp;result += dp.at(i);}else{break;}}return result;    }};void process(){ int num; Solution solution; int result; while(cin >> num ) { result = solution.countNumbersWithUniqueDigits(num); cout << result << endl; }}int main(int argc , char* argv[]){process();getchar();return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 裱花剩下的奶油怎么办 打过头的淡奶油怎么办 淡奶油发过了怎么办 打好的蛋清有水怎么办 想戒烟却坚持不了怎么办 给淮山弄的很痒怎么办 淮山接触皮肤痒怎么办 洗山药后手很痒怎么办 公司老板跑路了怎么办 小工厂老板跑路怎么办 学生医保卡丢了怎么办 在私企年龄大了怎么办 百度网盘上传慢怎么办 百度云盘上传慢怎么办 手机qq打字闪退怎么办 苹果5s手机闪退怎么办 手机qq总是闪退怎么办 qq邮箱密码忘了怎么办 qq加不了群怎么办视频 孩子好几天不大便怎么办 宝宝7天没有大便怎么办 40天小孩不拉屎怎么办 40多天婴儿便秘怎么办 小孩拉绿色稀便怎么办 5岁好几天不拉屎怎么办 2个月宝宝不大便怎么办 两月宝宝不拉屎怎么办 好几天没大便了怎么办 初生婴儿便秘解不出大便怎么办 小孩大便拉不出来怎么办 新生儿3天没大便怎么办 新生儿5天没大便怎么办 小孩好几天不大便怎么办 婴儿10天不拉屎怎么办 3岁大便拉不出来怎么办 孩子大便拉不出来怎么办 4岁大便拉不出来怎么办 排位队友太坑怎么办 lol遇到坑b队友怎么办 被冷暴力分手后怎么办 孕早期半夜饿了怎么办