来源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了,只需要加起来就行
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