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);
}
}