※ 引述 《Meaverzt (單推凜寶)》 之銘言:
:
: 題目:
:
: 有兩個數字num1跟num2
:
: 我們要找出符合兩個條件的一個x
:
: 1.x 的binary representation 中的1要跟num2一樣多
:
: 2.x跟num1 xor後的值要最小
:
: 思路:
:
: 為了讓xor後的值高位數的1越少越好
:
: 在高位數的num1是1 x就要是1 是0 x就要是0
:
: 所以一開始先數num2裡面有幾個1設做num
:
: 從num1的高位遍歷到低位
:
: 在num>0的情況下只要遇到1答案的這位就填1
:
: 如果全部的1都填完了 num還是>0
:
: 那就從低位到高位再遍歷一次num1
:
: 遇到0的時候填1保持xor後的值最小直到num=0
:
: 最後把結果轉回整數就是答案了
:
: Code:
:
: class Solution(object):
: def minimizeXor(self, num1, num2):
: num1,num2=bin(num1)[2:],bin(num2)[2:]
: if len(num1)<len(num2):
: num1=(len(num2)-len(num1))*'0'+num1
: ans=['0' for i in num1]
: num=0
: for i in num2:
: if i=='1':
: num+=1
: for i in range(len(num1)):
: if num1[i]=='1' and num>0:
: num-=1
: ans[i]='1'
: for i in range(len(num1)-1,-1,-1):
: if num1[i]=='0' and num>0:
: num-=1
: ans[i]='1'
: return int(''.join(ans),2)
:
: 位元運算太難了
:
: 只想的出用字串的
:
: 肥肥就這樣了
思路:
差不多 都不是位運算 轉成字符一個一個算
先把高位變成1
有多的1就從低位開始改成1
python code:
class Solution:
def minimizeXor(self, num1: int, num2: int) -> int:
l = bin(num2).count("1")
num1 = bin(num1)[2:]
result = ["0"] * len(num1)
for i in range(len(num1)):
if l == 0:
break
if num1[i] == "1":
result[i] = "1"
l -=1
for i in range(len(result)-1,-1,-1):
if l == 0:
break
if result[i] == "0":
result[i] = "1"
l -=1
return int("".join(result),2)