【LeetCode 简单题】110-数字的补数

声明:

今天是第110道题。给定一个正整数,输出它的补数,补数是对该数的二进制表示取反。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除

(手动比心ღ( ´・ᴗ・` ))

正文

题目:给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。

注意:

  1. 给定的整数保证在32位带符号整数的范围内。
  2. 你可以假定二进制数不包含前导零位。

示例 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

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/84376558