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

标签 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。你能帮我优化一下吗?

最佳答案

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

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

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

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

关于algorithm - 检查给定值 AorB 和 APlusB 是否存在 A 和 B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47574758/

相关文章:

algorithm - 通过python 3中的数字组合算法解码

java - 数组相关问题的时间复杂度

algorithm - 是否可以反转双向循环链表?如果是,那么如何?

algorithm - 如何求一个数的 N 的补数?

java - 为什么我的 int 没有正确返回?

java - 检查部分已知的整数是否在某个范围内

java - 将 'bits' 写入 C++ 文件流

c++ - c++中下列表达式的含义是什么

java - 寻找数据趋势的算法?

string - 最小破弦成本的动态规划