Table of Contents
中文版:
给你三个正整数 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
英文版:
1318. Minimum Flips to Make a OR b Equal to c
Given 3 positives numbers a, b and c. Return the minimum flips required in some bits of a and b to make ( a OR b == c ). (bitwise OR operation).
Flip operation consists of change any single bit 1 to 0 or change the bit 0 to 1 in their binary representation.
Example 1:
Input: a = 2, b = 6, c = 5
Output: 3
Explanation: After flips a = 1 , b = 4 , c = 5 such that (a OR b == c)
Example 2:
Input: a = 4, b = 2, c = 7
Output: 1
Example 3:
Input: a = 1, b = 2, c = 3
Output: 0
My answer:
class Solution:
def minFlips(self, a: int, b: int, c: int) -> int:
binA = bin(a)[2:]
binB = bin(b)[2:]
binC = bin(c)[2:]
lenA = len(binA)
lenB = len(binB)
lenC = len(binC)
max_len = max(lenA, lenB, lenC)
binA = '0'*(max_len-lenA) + binA
binB = '0'*(max_len-lenB) + binB
binC = '0'*(max_len-lenC) + binC
ans = 0
for i in range(len(binC)):
if binC[i] == '0':
if binA[i] == '1' and binB[i] == '1':
ans += 2
elif binA[i] == '1' or binB[i] == '1':
ans += 1
elif binA[i] == '0' and binB[i] == '0':
ans+=1
return ans
"""
2
6
5
4
2
7
1
2
3
7
8
15
"""
Constraints:
1 <= a <= 10^91 <= b <= 10^91 <= c <= 10^9
解题报告:
1、把 a, b, c 的值都转换为二进制,Python 有可直接调用的函数 bin(),生成结果为字符串类型,且前边带两位 '0b',所以从第三位开始取数,即 [2:]。
2、由于 a b c 的数值转换为二进制之后位数可能不同,所以要进行位数对齐,选取位数最长的一个对齐。
2、题目为或运算,即:只要有1,结果就为1。所以查看 a|b 之后的结果与 c 进行按位对比。按照 c 值每一位为 0 或 1 分开讨论,如果 c 中某位为0,则 a, b 对应位不应该有 1;如果c 中某位为 1 而 a, b 对应位都为 0,则有一位要转为1。