1684. K-wolf数
CAT 专属题目
中文English
Alice认为整数 x
是K-wolf数,如果x
的十进制表示中的每k
个相邻数字都是不同的。
给定(l
,r
,k
),请计算在[l,r]
范围内有多少个K-Wolf数。
样例
样例 1:
输入: l=1,r=1,k=2
输出: 1
解释:
1是2-wolf数。
样例 2:
输入: l=20,r=100,k=5
输出:72
解释:
22,33,44,55,66,77,88,99,100不是5-wolf数。
注意事项
- 1≤ l ≤ r ≤1e18
- 2≤ k ≤5
因为初始位数可以为0,比如00571=571,从最高位开始计算,再递归计算999..99,-----999,99,9。此题类似https://leetcode.com/problems/numbers-with-repeated-digits/description/
public class Solution {
/**
* @param l: the start range
* @param r: the end range
* @param k: the number of digits that should be different
* @return: the number of K-wolf numbers in range [l,r]
*/
public long getCount(long l, long r, int k) {
// Write your code here.
return count(r,k)-count(l-1,k);//计算每一位
}
long count(long n,int k){
if(n<10) return n;
char[] num=(n+"").toCharArray();
int len=num.length;
int[] rec=new int[len];
for(int i=0;i<len;i++) rec[i]=num[i]-'0';
long cnt=0;
long t=rec[0]-1;
for(int i=1;i<len;i++){
t*=Math.max(10-i,10-k+1);
}
cnt+=t;
out:
for(int i=1;i<len;i++){
int v=rec[i]-1;
int m=v;
for(int j=i-1;j>=0&&j>=i-k+1;j--){
if(rec[j]<=v) m--;;
}
if(m<-1) break;
if(m>=0){
long c=m+1;
for(int j=i+1;j<len;j++){
int a=Math.max(10-j,10-k+1);
c*=a;
}
cnt+=c;
}
for(int j=i-1;j>=0&&j>=i-k+1;j--){//检查是否有相同,有则停止
if(rec[j]==rec[i]) break out;
}
if(i==len-1){//检查最后一位
cnt++;
}
}
return cnt+count((long)Math.pow(10.0,len-1)-1,k);
}
}