01 | 整数

知识点

  1. 有符号的整数用二进制表示时最左边第一位代表正负符号、如果操作系统是32位的则表示的整数范围是 [−2^31, 2^31−1], 在计算过程中要防止溢出。
  2. 整数实际上使用二进制存储的,解题时转化为二进制的位计算有时会更加方便。位运算共有6种:非、与、或、异或、左移和右移
  3. 考虑边界情况,比如0不可以当除法的分母

基础练习

1.整数除法

Leetcode.29

解题思路

  1. 首先考虑a和b都是正整数,除数是b,被除数是a,存在最小正整数k>= 0,使得b乘以2的k次方大于a。b-a乘以2的k-1次方后,得到新的余数,余数>=b,循环计算k值,直到余数<b,将所有的k值累加。
  2. 负数转为正数可能会溢出,所以统一将正数转为负数,使用正负数的标记变量来记录,最后返回的商是正数还是负数。
  3. 边界情况考虑−2^31除以-1时会导致溢出,此时应该直接返回最大整数。

python3答案

class Solution:
    def divide(self, a: int, b: int) -> int:
        INT_MIN, INT_MAX = -2**31, 2**31 - 1
        if a == INT_MIN and b == -1:
            return INT_MAX
        
        if a == 0:
            return 0

        nagtive_flag = False

        if a > 0:
            a = -a 
            nagtive_flag = not nagtive_flag
        
        if b > 0:
            b = -b 
            nagtive_flag = not nagtive_flag

        
        left = a
        result = 0

        while left <= b:
            k = 0
            while b * (2**k) >= left :
                k += 1
            left = left - b*(2**(k-1))
            result += 2**(k-1)
          
		return -result if negative_flag else result

2.二进制加法

Leetcode.67

解题思路

二进制的加法类比十进制的加法,满二进一。因为加法是右对齐的,所以需要先把两个字符串反转,计算完成后再将结果反转一次。

python3实现

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        len_a = len(a)
        len_b = len(b)
        reverse_a = ""
        reverse_b = ""
        size_max = max(len_a, len_b)
        result = ""
        rev = ""
        forward = 0
        for i in range(len_a -1,-1, -1):
            reverse_a += a[i]
        
        for i in range(len_b -1,-1, -1):
            reverse_b += b[i]

        for i in range(size_max):
            if i < len_a:
                m = int(reverse_a[i]) 
            else:
                m = 0
            if i < len_b:
                n = int(reverse_b[i]) 
            else:
                n = 0
            if m + n + forward >= 2:
                result += str(m + n + forward - 2)
                forward = 1
            elif forward > 0:
                result = result + str(m+n+forward)
                forward = 0
            else:
                result = result + str(m + n)

        if forward > 0:
            result += '1'
            forward -= 1

        for i in range(len(result)-1,-1,-1):
            rev = rev + str(result[i])

        return rev

扩展练习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值