不准访问
- 积分
- 180
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2018-5-11
- 最后登录
- 1970-1-1
|
这题我想错了,昨天研究一天没研究明白。 大概说一下思路吧。
首先是我的回答, 这个和你的问题并不相似, 而且我的答案也不能满足223,实际上还是把所有的数字都走了一遍, 非常的慢。怎么硕呢, 非常的没有牌面了。
回来说你的这个题, 先分析一下。已知 0 <=L <= H <= 2^62, 这也就是说 run time < O[n]。 如果是O[n] 的话肯定是不能满足 <1s 。也就是说target在O[1], O[lgn], O[sqrtN] 这几个选项中间。
再说题目本身, 其实是对于所有在 [lo - hi]中间的数字, 找
1) 至少包含一个6的数字
2) 至少包含一个8的数字
3) 至少包含1个6且包含一个8的数字。
前两问可以解, 代码如下
```
long nodigit0(long cap, int dig)
{
long sum = 1, k = 0, cap2 = cap;
while(cap > 0)
{
long d = cap % 10;
cap /= 10;
if(d == dig) sum = 0;
if(d > dig) d--;
sum += (long) Math.pow(9, k) * d;
k++;
}
return cap2 - sum;
}
```
简单解释一下代码, 是在数cap里面有多少个数不包括digit。 举例, 59633 里面有多少个数不包括6呢?这个数的方法是 59633 = 50000 + [5]9000 + [59]600 + [596]30 + [5963]3
显然 [5963]3 里面有0-3 共4个数, 所以sum = 4
[596]30 里面有 [0-2] * 9 =27 个不包括6的数, 所以 sum = 31。这个是从59600到59629的数字, 不包括59630,以下同理。
[59]600 里面包括有[0-5]*9*9=486个数, 但是本位是6,6之后带的所有数字都有6,所以sum归零。 sum = 486
[5]9000 里面有[0-8]*9*9*9个数, 但是8>6, 所以拿掉6以后还剩[0-5,7,8]*9*9*9 个数 sum += 。。
50000 里面有[0-4]*9*9*9*9个数。 sum +=。。
接下来应该是数同时有6跟8的方法, 我一下想不到。。 感觉智商捉急了。
所以应该是个挺数学的题目。。
|
|