java - 如何找到这两个代码之间的区别?执行时两者都给出相同的答案,但网站说一个代码是部分正确的
问题描述
问题是计数总设置位:https ://www.interviewbit.com/problems/count-total-set-bits/
我的解决方案是:
public class Solution {
public int solve(int A) {
long sum=0;
long a=A+1;
for(int i=0;i<32;i++){
sum=sum+(((a/(int)Math.pow(2,i)))*(int)Math.pow(2,i-1) + (int)Math.max(0, a%(int)Math.pow(2,i+1)-(int)Math.pow(2,i)));
}
return (int)sum%1000000007;
} }
但是,这表明我的回答只是部分正确。我可以说我的代码和他们给出的解决方案得到了相同的答案,至少高达 1000。
我检查了他们的解决方案:
public class Solution {
public int solve(int A) {
long val1,val2,cnt;
cnt = 0;
for(int i = 1;i<32;i++){
val1 = (int)((A+1)/Math.pow(2,i));
val2 = (int)((A+1)%Math.pow(2,i));
if(val2 > Math.pow(2,i-1))
val2 = val2 - (int)Math.pow(2,i-1);
else
val2 = 0;
cnt = cnt + (int)(val1*Math.pow(2,i-1)) + val2;
}
return (int)(cnt%1000000007);
}
}
我发现这段代码使用的公式与我使用的完全相同,但分为部分和行。那么我应该在我的代码中更正什么?(我是 Java 初学者。)
解决方案
您的代码中的问题在这里:
(int)Math.pow(2,i)
这将在 31 时溢出i
,因为 2^31 对于 int 来说几乎没有太大(最大的 int 是 2^31 - 1)。另一种解决方案是在除法之后才进行演员表。
推荐阅读
- python - 如何获取innerHTML元素的文本?
- swift - 如何在 iOS 13 中获取滚动视图的完整快照?
- sed - 如何使用 sed 仅查找文件的第一行和最后一行
- powershell - GetEventLog - 如何在一行中扩展“消息”属性
- azure-active-directory - 如何在非交互式工作流中通过浏览器对 Azure AD 进行身份验证?
- angular - ReferenceError:调用以太坊合约方法时“未定义originalStackTrace”
- android - 在后台运行的 Android 应用不需要 Activity
- instagram - 如何从 instaloader 下载主题标签的热门帖子
- c# - 有没有办法从 gridview 列计算增值税(增值税 = 15%)?
- jmeter - 在 JMeter 中参数化源文件夹目录或文件路径