360笔试第二题,高效解法
比如,在10进制中,23~267中199中“9”最多,所以返回结果就是2。
解题思路:对于上面的例子,可以这样来划分区间
各个子区间除了各位其他各位数字相同,所以含“9”最多的一定在下面这些数字中
那么最终的结果是下面两者中的最大值:2~25中“9”的个数+1、267.
如果右边界恰好是259的话,就直接是:2~25中“9”的个数+1
这便形成了简单的递归思路。(有兴趣的,可以用循环试着写写)
相比于从左边界到右边界穷搜(我笔试中的解法)肯定会快不少。
代码如下:
int getnumber(int k,int l,int r){
//cout<<l<<" "<<r<<endl;
if(r<k)return 0;//已经递归到个位数了。
l=l/k;
if(r%k==k-1)
{
r=r/k;
return getnumber(k,l,r/k)+1;
}
else //if(r%k!=k-1)
{
int tmp=countk(k,r);
r=r/k-1;
return max(getnumber(k,l,r)+1,tmp);
}
} //计算n中数字k-1的个数
int countk(int k,int n)
{
int s=0;
while(n)
{
if(n%k==(k-1))++s;
n/=k;
}
return s;
}
