题目描述
Given a positive integer N, return the number of positive integers less than or equal to N that have at least 1 repeated digit.
Example 1:
Input: 20
Output: 1
Explanation: The only positive number (<= 20) with at least 1 repeated digit is 11.
Example 2:
Input: 100
Output: 10
Explanation: The positive numbers (<= 100) with atleast 1 repeated digit are 11, 22, 33, 44, 55, 66, 77, 88, 99, and 100.
Example 3:
Input: 1000
Output: 262
Note:
1 <= N <= 10^9
代码
class Solution {
private int n;
private int dis = 0;
public int numDupDigitsAtMostN(int N) {
n = N;
go(0,0);
return N+1-dis;
}
public void go(long val,int bs){
if(val <= n)++dis; //统计不重复数字
if(val*10 > n)return;
for(int i = 0; i <= 9;++i){
if(bs == 0 && i == 0)continue; //排除最高位为0的情况
if((bs & (1<<i)) != 0)continue; //二进制对应位置上的值为1,说明val已经存在这个值。比如bs的二进制表示,右数第5位是1,说明val中已经存在4。
go(val * 10+i,bs|(1<<i));//
}
}
}