gpt4 book ai didi

java - 如何找到这两个代码之间的区别?两者在执行时都给出相同的答案,但网站说一个代码是部分正确的

转载 作者:行者123 更新时间:2023-12-03 21:44:47 25 4
gpt4 key购买 nike

问题是计数总设置位: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)
这将在 i 时溢出是 31,因为 2^31 对 int 来说几乎没有太大(最大的 int 是 2^31 - 1)。另一个解决方案是在除法之后才进行类型转换来解决这个问题。

关于java - 如何找到这两个代码之间的区别?两者在执行时都给出相同的答案,但网站说一个代码是部分正确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65262424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com