数组形式的整数加法-----leedcode989、66、415、67、2

来源leedcode,侵权删
小白整理一下数组形式、字符串形式的整数加法问题等
989
在这里插入图片描述
#####暴力解法####相加得出整数,再由整数转数组,sum =int(sum/10) 有整数溢出问题,注sum =int(sum//10)

class Solution:
    def addToArrayForm(self, num: List[int], k: int) -> List[int]:
        # # 1 暴力解法会产生整数溢出错误/
        # sum = 0
        # l = len(num)-1
        # for i in range(0,len(num)):
        #     sum += num[i]*10**(l-i)
        # sum = sum+k        
        # # return sum
        # #将整数转换为数组
        # l1=[]
        # if sum == 0:
        #     return [0]
        # while sum >=1:
        #     a = sum%10
        #     sum =int(sum//10)                   #####直接除10,会有溢出问题
        #     l1.append(a)
        #     bb=list(reversed(l1))
        # return bb

以下解答均不展示暴力解法
本题就是简单的数组形式与整数相加。
注意:要从后往前加+,因为主要是一个进位问题,如果相加的值大于10进一位,carry=1
加完之后的值append到一个列表中,再反转列表

class Solution:
    def addToArrayForm(self, num: List[int], k: int) -> List[int]:
        res = []
        i, carry = len(num) - 1, 0
        while i >= 0 or k != 0:
            x = num[i] if i >= 0 else 0
            y = k % 10 if k != 0 else 0

            sum = x + y + carry
            res.append(sum % 10)
            carry = sum // 10

            i -= 1
            k //= 10
        if carry != 0: res.append(carry)
        return res[::-1]

66
在这里插入图片描述
本题就是在数组的基础上+1,这一题纯属上一题的特殊情况,令k=1就是这种情况
另一种思路:

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        length= len(digits)
        for i in range(length-1,-1,-1):
            if digits[i] != 9:
                digits[i] =digits[i]+1
                return digits
            else:
                digits[i]=0
        #跳出for循环说明全是9
        temp = digits
        temp.append(1)
        return temp[::-1] 

415
和前面两题思想是一样的,主要就是字符串的处理上,不用append了,只需要加起来就行
while i1 >= 0 or i2 >= 0:x = ord(num1[i1]) - ord('0') if i1 >= 0 else 0y = ord(num2[i2]) - ord('0') if i2 >= 0 else 0
在这里插入图片描述

在这里插入图片描述

class Solution:
    def addToArrayForm(self, num: List[int], k: int) -> List[int]:
        res = ''
        i1, i2, carry = len(num1) - 1, len(num2) - 1, 0
        while i1 >= 0 or i2 >= 0:
            x = ord(num1[i1]) - ord('0') if i1 >= 0 else 0
            y = ord(num2[i2]) - ord('0') if i2 >= 0 else 0

            sum = x + y + carry
            res += str(sum % 10)
            carry = sum // 10

            i1, i2 = i1 - 1, i2 - 1
        if carry != 0: res += str(carry)
        return res[::-1]

67在这里插入图片描述
和字符串相加一个道理,一个逢10进1,一个逢2进1

class Solution:
    def addToArrayForm(self, num: List[int], k: int) -> List[int]:
        res = ''
        i1, i2, carry = len(a) - 1, len(b) - 1, 0
        while i1 >= 0 or i2 >= 0:
            x = ord(a[i1]) - ord('0') if i1 >= 0 else 0
            y = ord(b[i2]) - ord('0') if i2 >= 0 else 0

            sum = x + y + carry
            res += str(sum % 2)
            carry = sum // 2

            i1, i2 = i1 - 1, i2 - 1
        if carry != 0: res += str(carry)
        return res[::-1]

2在这里插入图片描述

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        #先定义一个虚拟节点和指针 dummy指的是虚拟节点 curr是指针
        dummy = curr = ListNode()
        carry = 0
        #当l1的指针和l2的指针!=null   程序运行结束
        while l1 or l2:
            x = l1.val if l1 else 0
            y = l2.val if l2 else 0

            sum = x + y + carry
            curr.next = ListNode(sum%10)
            curr = curr.next
            carry = int(sum /10)

            if l1:l1 =l1.next
            if l2:l2 = l2.next
        #当l1和l2的指针都为空时,进的位carry就是当前指针下一个指针的   值     
        if carry:curr.next = ListNode(carry)
        return dummy.next
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值