[LeetCode] 3226. Number of Bit Changes to Make Two Integers Equal

CNoodle發表於2024-11-02

You are given two positive integers n and k.

You can choose any bit in the binary representation of n that is equal to 1 and change it to 0.

Return the number of changes needed to make n equal to k. If it is impossible, return -1.

Example 1:
Input: n = 13, k = 4
Output: 2

Explanation:
Initially, the binary representations of n and k are n = (1101)2 and k = (0100)2.
We can change the first and fourth bits of n. The resulting integer is n = (0100)2 = k.

Example 2:
Input: n = 21, k = 21
Output: 0

Explanation:
n and k are already equal, so no changes are needed.

Example 3:
Input: n = 14, k = 13
Output: -1

Explanation:
It is not possible to make n equal to k.

Constraints:
1 <= n, k <= 106

使兩個整數相等的位更改次數。

給你兩個正整數 n 和 k。

你可以選擇 n 的 二進位制表示 中任意一個值為 1 的位,並將其改為 0。

返回使得 n 等於 k 所需要的更改次數。如果無法實現,返回 -1。

思路

這是一道位運算的問題。首先注意,這道題裡我們只能改 n 的某個 digit,不能改 k 中的 digit;而且我們只能把 1 改成 0,不能把 0 改成 1。

那麼判斷是否能改和怎麼改呢?因為不能改 k 中的任何 digit,所以我們可以計算一下 n & k,如果n & k != k,則說明 n 中有一些位置上存在 0,而我們是不能改動 0 的,這種 case 我們就直接返回 -1。如果n & k == k,起碼說明我們可以改。此時我們可以用各種語言自帶的 API 統計一下 n 和 k 分別包含幾個 1,然後返回他們的差值即可。

或者我們也可以看 n | k 是否等於 n,如果等於 n,則說明 k 裡面不存在多餘的 1。透過這個方式我們也可以判斷是否可以改動。

複雜度

時間O(1)
空間O(1)

程式碼

Java實現

class Solution {
    public int minChanges(int n, int k) {
        return (n & k) != k ? -1 : Integer.bitCount(n ^ k);
    }
}
class Solution {
    public int minChanges(int n, int k) {
        return (n | k) != n ? -1 : Integer.bitCount(n ^ k);
    }
}

相關文章