如何找到序列1,5,10,50,100,…中不大于x的最大值?
解决方案
你思路是对的,只需要把5开头的序列元素生成逻辑补全就行,和10的幂次逻辑类似:
核心思路
- 先拿到对应x的10的幂次值(就是你已实现的
closestTo10返回的结果) - 把这个值乘以5,得到5开头序列的候选值
- 如果候选值≤x,那它就是5开头序列里不大于x的最大值
- 如果候选值>x,就把10的幂次除以10再乘以5(相当于降一个量级的5开头数)
- 最后取10幂次值和5开头候选值的较大者,就是目标结果
代码实现
首先实现生成5开头序列最大值的函数:
int closestTo5(int value) { int powerOf10 = (int)Math.pow(10.0, Math.floor(Math.log10(value))); int candidate = powerOf10 * 5; if (candidate <= value) { return candidate; } else { // 处理value=1的情况,powerOf10/10会变成0,所以要确保返回至少1 return Math.max((powerOf10 / 10) * 5, 1); } }
然后整合两个函数得到最终结果:
int findMaxInSequence(int x) { int val10 = closestTo10(x); int val5 = closestTo5(x); return Math.max(val10, val5); }
验证示例
我们用题目给的例子测试:
- x=1:val10=1,val5=1 → 结果1 ✔️
- x=9:val10=1,val5=5 → 结果5 ✔️
- x=49:val10=10,val5=5 → 结果10 ✔️
- x=52:val10=10,val5=50 → 结果50 ✔️
当然你也可以把逻辑合并到一个函数里,减少冗余:
int findMaxInSequence(int x) { double logVal = Math.log10(x); int exponent = (int)Math.floor(logVal); int power10 = (int)Math.pow(10, exponent); int candidate5 = power10 * 5; int max5 = candidate5 <= x ? candidate5 : Math.max((power10 / 10) * 5, 1); return Math.max(power10, max5); }
内容的提问来源于stack exchange,提问作者tigrou
相关产品推荐
相关产品推荐

