📌  相关文章
📜  通过递增它们或对它们进行按位或来最小化使两个整数相等的步骤

📅  最后修改于: 2022-05-13 01:56:07.573000             🧑  作者: Mango

通过递增它们或对它们进行按位或来最小化使两个整数相等的步骤

给定两个正整数AB 。任务是使用最小操作使它们相等,例如:

  • A = A + 1(将 a 增加 1)。
  • B = B + 1(将 b 增加 1)。
  • A = A | B(将 A 替换为 A 和 B 的按位或)。

例子

贪心方法:问题可以在位操作的帮助下使用贪心技术来解决。

直觉:

插图:

按照下面提到的步骤来实施该方法:

  • i = A 迭代到 B并检查 ( i | B ) 是否与B相同以及所需的步骤。
  • 找到以这种方式使 A 和 B 相等所需的最小步骤(例如x )。
  • 现在迭代j = B 到 B+x
    • 检查j是否满足上面提到的情况 2。
    • 更新使 A 和 B 相等所需的最小步骤。
  • 返回最小步数。

下面是上述方法的实现:

Java
// Java code to implement the approach
 
import java.io.*;
import java.lang.*;
class GFG {
 
    // Function to find min steps
    // to convert A to B
    public static int AToB(int a, int b)
    {
        int ans = Integer.MAX_VALUE;
 
        // If a is greater than b, swap them
        if (a > b) {
            int temp = b;
            b = a;
            a = temp;
        }
 
        // Check for every i from 0 to b
        for (int i = a; i <= b; i++) {
 
            // If i or b equals to b then
            // update the answer
            if ((i | b) == b) {
                int j = Math.abs(a - i);
                if (i != b)
                    j++;
                ans = Math.min(ans, j);
            }
        }
 
        for (int i = b + 1; i <= b + ans; i++) {
            if ((i | a) == i) {
                ans = Math.min(ans, i - b + 1);
            }
        }
 
        return ans;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int A = 2;
        int B = 5;
        System.out.println(AToB(A, B));
    }
}


输出
2

时间复杂度: O(B * log B)
辅助空间: O(1)