声明:
今天是第110道题。给定一个正整数,输出它的补数,补数是对该数的二进制表示取反。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。
注意:
- 给定的整数保证在32位带符号整数的范围内。
- 你可以假定二进制数不包含前导零位。
示例 1:
输入: 5 输出: 2 解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。示例 2:
输入: 1 输出: 0 解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。
解法1。将num转为二进制后遍历其每一位,取反后输出到一个新的列表rev里,再连接成字符串,返回其int的强制转换结果,代码如下。
执行用时: 24 ms, 在Number Complement的Python提交中击败了99.52% 的用户
class Solution(object):
def findComplement(self, num):
"""
:type num: int
:rtype: int
"""
rev = ['1' if i == '0' else '0' for i in bin(nums)[2:]]
rev = ''.join(rev)
return int(rev,2)
解法2。这种思路是利用与1逐位异或的效果等同于取非,其实把过程写出来非常得明了,当i左移到大于等于num的位数时就表示任务结束,num所有位的取非已经完成,代码如下。
执行用时: 24 ms, 在Number Complement的Python提交中击败了99.52% 的用户
class Solution(object):
def findComplement(self, num):
"""
:type num: int
:rtype: int
"""
i = 1
while i <= num:
num ^= 1
i <<= 1 # 左移,高位丢弃,低位补0
return num
结尾
解法1:原创
解法2:https://blog.csdn.net/ThrallOtaku/article/details/80437402