给定正整数 N,返回小于等于 N 且具有至少 1 位重复数字的正整数。
示例 1:
输入:20
输出:1
解释:具有至少 1 位重复数字的正数(<= 20)只有 11 。
示例 2:
输入:100
输出:10
解释:具有至少 1 位重复数字的正数(<= 100)有 11,22,33,44,55,66,77,88,99 和 100 。
我的代码 4ms
class Solution {
public:
int numDupDigitsAtMostN(int N) {
string s=to_string(N);
int a[10]={0};
int b[10]={0};
int sum=0;
char index;
for(int i=s.size()-1;i>=1;i--)
{
int t=9;
for(int j=1;j<i;j++)
t*=(10-j);
sum+=t;
}
for(int i=0;i<s.size();i++)
{
if(i==0)
index='1';
else
index='0';
if(s[i]>index)
{
int t=s[i]-index;
t-=a[s[i]-'1'];
if(t>=1)
{
for(int j=1;j<s.size()-i;j++)
t*=(10-j-i);
sum+=t;
}
}
for(int k=s[i]-'0';k<10;k++)
a[k]++;
b[s[i]-'0']++;
if(b[s[i]-'0']>=2) break;
if(i==(s.size()-1)) sum++;
}
return N-sum;
}
};