leecode第5天

66、加一
# 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
# 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
# 你可以假设除了整数 0 之外,这个整数不会以零开头。
class Solution(object):
    def plusOne(self, digits):
        """
        对用列表表示的数字进行加一操作
        
        Args:
            digits (List[int]): 表示数字的整数列表,每个元素是0-9的数字,例如[1,2,3]表示数字123
            
        Returns:
            List[int]: 加一后的结果列表,例如输入[1,2,3]返回[1,2,4]
        
        :type digits: List[int]
        :rtype: List[int]
        """
        # 将数字列表转换为字符串形式进行运算
        digits_str=''.join(map(str,digits))
        # 执行加一操作并转换回列表
        plusone=int(digits_str)+1
        return list(map(int, str(plusone)))#字符串
    
#[注]:
#1.join方法要求可迭代对象中的每个元素都是字符串。如果元素不是字符串,需要先进行类型转换。可以使用 map 函数或其他方法进行转换。
#2.性能考虑,对于非常大的列表,使用 join 方法通常比使用 + 操作符连接字符串更高效,因为 join 方法在底层进行了优化。
时间复杂度分析O(n)
map(str, digits):遍历列表将每个元素转为字符串,时间复杂度为 O(n)
join():拼接字符串需要遍历所有字符,时间复杂度为 O(n)
int(digits_str):字符串转整数的过程需要扫描每一位,时间复杂度为 O(n)
+1操作:整数加法在极端情况(如全9数字)需要处理所有位,时间复杂度为 O(n)
str(plusone)和结果列表转换:最终转换回列表需要处理所有结果位,时间复杂度为 O(n)
空间复杂度分析O(n)
中间生成的字符串digits_str占用 O(n) 空间
转换后的整数plusone在内存中存储需要 O(n) 位空间
最终返回的结果列表占用 O(n) 空间
关键结论
该算法通过类型转换实现功能,时间和空间复杂度均为线性阶。虽然实现简洁,但存在以下潜在问题:
1.当输入列表长度超过 10^18 时可能触发Python大整数计算的性能下降
2. 数字转字符串操作无法处理前导零的特殊需求(需看具体业务场景)
3. 空间占用是输入规模的两倍(原始列表+中间字符串+结果列表)
67、二进制求和
# 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
class Solution(object):
    #自己
    def addBinary(self, a, b):
        """
        :type a: str
        :type b: str
        :rtype: str
        """
            def addBinary(self, a, b):
        """
        :type a: str
        :type b: str
        :rtype: str
        """
        # 将二进制字符串转换为逆序数字列表,便于按位权计算
        a_lst_rev=list(map(int,a))
        a_lst_rev.reverse()
        b_lst_rev=list(map(int,b))
        b_lst_rev.reverse()
		# 将逆序二进制位列表转换为十进制数值
        a_otc=0
        for i in range(len(a_lst_rev)):
            a_otc+=a_lst_rev[i]*2**i
        b_otc=0
        for i in range(len(b_lst_rev)):
            b_otc+=b_lst_rev[i]*2**i
		#求和并转二进制,返回去除0b字符的二进制字符串:bin返回值带0b的二进制字符串
        s=a_otc+b_otc
        re=bin(s)[2:]#从下标三开始
        return re
    
    #leecode
    def addBinary(self, a, b):
        """
        将两个二进制字符串相加并返回二进制结果
        
        Args:
            a (str): 二进制字符串形式的第一个加数,如'1010'
            b (str): 二进制字符串形式的第二个加数,如'1101'
        
        Returns:
            str: 二进制字符串形式的和,如'10111'
        """
        # 将二进制字符串转换为十进制整数,
        #int(a, 2):是Python中int()函数的一种用法,
        #用于将一个以二进制字符串形式表示的数值(即由字符 '0' 和 '1' 组成的字符串)转换为对应的整数
        a_int = int(a,2)
        b_int = int(b,2)
        
        # 执行十进制加法运算
        sum = a_int + b_int
        
        # 将结果转换回二进制字符串格式(去除前导'0b')
        sum_bin = bin(sum)[2:]
        return sum_bin
处理输入字符串a和b
反转字符列表
计算a的十进制值
计算b的十进制值
求和得到s
将s转为二进制字符串
返回结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值