题目
给你三个正整数 a、b 和 c。
你可以对 a 和 b 的二进制表示进行位翻转操作,返回能够使按位或运算 a OR b == c 成立的最小翻转次数。
「位翻转操作」是指将一个数的二进制表示任何单个位上的 1 变成 0 或者 0 变成 1 。
示例 1:
输入:a = 2, b = 6, c = 5
输出:3
解释:翻转后 a = 1 , b = 4 , c = 5 使得 a OR b == c
示例 2:
输入:a = 4, b = 2, c = 7
输出:1
示例 3:
输入:a = 1, b = 2, c = 3
输出:0
提示:
1 <= a <= 10^9
1 <= b <= 10^9
1 <= c <= 10^9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-flips-to-make-a-or-b-equal-to-c
解题思路:
将 aorb = a | b 和 c 转化为相同长度的字符串按字符位置进行比较:
1,当 aorb==“1” , c =“0”: 此时如果 a = “1” 且 b =“1”, 则需要翻转2次; a 和 b只有一个为 ”1“, 需要翻转1次;
2. 当aorb =“0”, c =“1”: 则说明 a = b = 0, 则a和b只有一个转成1就可以了,需要转换1次
注意事项:
转化为二进制以后,字符串的长度要保持一致,不然位置容易错误;
代码:
class Solution(object):
def minFlips(self, a, b, c):
"""
:type a: int
:type b: int
:type c: int
:rtype: int
"""
res = 0
bina = bin(a)[2:]
binb = bin(b)[2:]
binc = bin(c)[2: ]
aORb = bin(a|b)[2: ]
num = max(len(bina), len(binb), len(binc), len(aORb))
bina = self.comstr(bina, num)
binb = self.comstr(binb, num)
binc = self.comstr(binc, num)
aORb = self.comstr(aORb, num)
if aORb == binc:
return res
for i in range(len(aORb)-1, -1 ,-1):
if aORb[i] =="1" and binc[i] =="0":
if bina[i]=="1" and binb[i]=="1":
res += 2
else:
res += 1
elif aORb[i] =="0" and binc[i] =="1":
res += 1
else:
continue
return res
def comstr(self, str1, num):
if len(str1) < num:
str1 = list(str1)
str1.insert(0, "0"*(num-len(str1)))
tmp = "".join(str1)
str1 = tmp
return str1