Re: [閒聊] 每日leetcode
看板Marginalman作者sustainer123 (溫水佳樹的兄長大人)時間10月前 (2025/01/15 18:11)推噓2(2推 0噓 1→)留言3則, 3人參與討論串1281/1552 (看更多)
※ 引述 《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)
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.137.251.232 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1736935908.A.3BC.html
推
01/15 18:19,
10月前
, 1F
01/15 18:19, 1F
→
01/15 18:24,
10月前
, 2F
01/15 18:24, 2F
推
01/15 18:31,
10月前
, 3F
01/15 18:31, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 1281 之 1552 篇):