java - 破解密码书平方根算法中的整数范围
问题描述
破解密码本的java中有一个求平方根的算法,如下所示:
int sqrt(int n) {
return sqrt_helper(n, 1, n);
}
int sqrt_helper(int n, int min, int max) {
if (max < min) return -1;
int guess = (min + max) / 2·,
if (guess *guess == n) {
return guess;
} else if (guess * guess < n) {
return sqrt_helper(n, guess + 1, max);
} else {
return sqrt_helper(n, min, guess - l);
}
}
问题是:
由于min
和max
是整数,它们可以具有范围内的任何值,即max = Integer.MAX_VALUE
那么如何不用担心guess = (min + max) / 2
它会越过允许的范围,或者guess *guess
也可以。
解决方案
既然你提到了“破解编码面试”......
通常在普通编码面试的背景下,人们不会担心这样的特定于实现的细节。面试官试图确认基本的能力和理解——他们很少想要运行你的代码,并且应该给你们两个都知道算法会在你的语言基本数据类型的极端限制下崩溃。如果面试官特别询问限制,那么您可以简单地提到该函数对于该语言中高于 (Integer.MAX_VALUE / 2) 的值将失败。
该限制将适用于您为编码面试编写的几乎所有算法,并且没有合理的面试官会期望您专门设计您的解决方案来缓解这种边缘情况。如果我要求候选人编写一个生成斐波那契数的函数,并且他们花时间尝试优化输出超过 16 位值的情况,我会觉得这非常令人反感。
如果出于某种原因您需要在现实生活场景中使用此算法找到极大值的平方根,我希望您必须使用针对您的特定语言的通用大数库来实现它。话虽如此,在几乎任何情况下,我都不会为任何实际用例推出自己的平方根算法。
推荐阅读
- javascript - 在分配变量之前无法进行适当的检查
- javascript - 是否有相当于“新窗口”的 bing?
- python - kivy函数在调用时不访问自身
- c - 如何将 .txt 中的信息扫描到结构数组?
- asp.net-mvc - 该请求的 iis Web 事件表单身份验证失败。原因:提供的票证无效
- c - 使用旧的 gcc 编译器编译 .c 文件
- r - 下采样以均衡因子水平对的计数?
- hyperledger-fabric - 数据收集配置文件:配置文件必须在所有组织中都相同吗?
- r - 将xml格式转换为r中的数据框
- c# - DefaultHttpContext 在集成测试中测试身份验证