检查A和B是否存在给定值AorB和APlusB

时间:2017-11-30 13:34:45

标签: algorithm bit-manipulation

问题陈述:

您将获得两个非负整数:longs pairOr和pairSum。

确定两个非负整数A和B是否可能同时具有:

  • A或B = pairOr
  • A + B = pairSum

在上面,“或”表示按位或运算符。

如果我们能找到这样的A和B,则返回True,否则返回False。

我的算法是这样的:

我采用了等式:A | B = X且A + B = Y,

现在从第二个等式中取代A的值后,(Y-B)| B = X。

我将从0到Y(代替B)遍历以检查上述等式是否为真。

代码段:

boolean isPossible(long orAandB,long plusAandB) {

    for(long i=0;i<=plusAandB;i++) {
        if(((plusAandB-i)|i)==orAandB ){
            return true;
        }
    }

    return false;

如果plusAndB的值为10^18,则会给出TLE。你能帮我优化吗?

1 个答案:

答案 0 :(得分:1)

你不需要完整的迭代,给出O(N)。有一种方法可以在O(logN)中完成。

但是完全解决这个问题会带走大部分的乐趣... ;-),所以这里是主线索:

您的等式(Y-B) | B= X是一个很好的观察,第二个是从右边开始一点一点地看一下这个等式(所以你不必担心借位第一名)。哪个Y,X和B的最后一位组合可以使你的方程成立?如果你找到一个B位,你怎么用高位继续递归(不要忘记减法可能需要借用)?我希望你能记住减去二进制数的规则。

请记住,问题只是要求真或假,而不是任何特定的A或B值,可以为您节省指数的复杂性。