PigyChan

it2026-06-11  8

357. 计算各个位数不同的数字个数

难度中等

给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n 。 示例:

输入: 2 输出: 91 解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。

个人思路:

设变量tol为位数等于n的 n-1个数的所有排序 即:n=3时 abc=ab+ac+bc dp[i]=dp[i-1]tol10

代码1.0

class Solution { public: int countNumbersWithUniqueDigits(int n) { if(n<=1) { return pow(10,n); } vector<int> dp(n+1,0); dp[2]=9; for(int i=3;i<=n;++i) { dp[i]=dp[i-1]*i*10-dp[i-1]; } return pow(10,n)-dp[n]; } };

结果出错

思路2.0

写下前几个,就能看出规律了。 n=1: res=10 n=2: res=9*9+10=91 # 两位数第一位只能为1-9,第二位只能为非第一位的数,加上一位数的所有结果 n=3: res=9 * 9 * 8+91=739 # 三位数第一位只能为1-9,第二位只能为非第一位的数,第三位只能为非前两位的数,加上两位数的所有结果

代码2.0

class Solution { public: int countNumbersWithUniqueDigits(int n) { if(n==0) { return 1; } vector<int> dp(n+1,1); dp[0]=1; dp[1]=9; for(int i=2;i<=n;++i) { dp[i]=dp[i-1]*(10-i+1); } return accumulate(dp.begin(),dp.begin()+n+1,0); } };
最新回复(0)