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

iyzzxitl  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(369)

问题是计数总设置位: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初学者。)

dtcbnfnu

dtcbnfnu1#

代码中的问题如下:

(int)Math.pow(2,i)

i 是31,因为2^31对于int来说太小了(最大的int是2^31-1)。另一种解决方法是在除法之后才进行演员表演。

相关问题