67.二进制求和
给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1" 输出:"100"
示例 2:
输入:a = "1010", b = "1011" 输出:"10101"
思路:将接收到的字符串变换为int形式,将两数相加,又将其变换为字符型二进制形式放入列表中,若两数相加和为0则直接返回0.
注意点:
1.字符型二进制变化为十进制整数:二进制每位乘的2的次方不同
n=int(s[i]) * flag + n
flag *= 2
2.十进制转化为二进制,取每次余数,将其变成字符形式储存在列表中,直至商为0
3.将字符型列表变换为整个字符串:"".join(字符型列表)
class Solution(object): def addBinary(self, a, b): """ :type a: str :type b: str :rtype: str """ i = len(a) - 1 j = len(b) - 1 n1 = 0 n2 = 0 flag = 1 while i >= 0: n1 = n1 + int(a[i]) * flag i -= 1 flag *= 2 flag = 1 while j >= 0: n2 = n2 + int(b[j]) * flag j -= 1 flag *= 2 n = n1 + n2 if n == 0: return "0" l = [] # res = "" i = 0 while n != 0: x = n % 2 l.insert(0, str(x)) //res += str(x) n = n // 2 s = "".join(l) return s //return str[::-1]
网上看的解法:
class Solution(object):
def addBinary(self, a, b):
res = ""
carry = 0
i = len(a) - 1
j = len(b) - 1
while i >= 0 or j >= 0 or carry != 0:
digitA = int(a[i]) if i >= 0 else 0
digitB = int(b[j]) if j >= 0 else 0
sum = digitA + digitB + carry
carry = 1 if sum >= 2 else 0
sum = sum - 2 if sum >= 2 else sum
res += str(sum)
i -= 1
j -= 1
return res[::-1]
利用以上解法,解出了第二题:
2.两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
思考:仅有当两链表都为空且无进位时才停止,为了防止两链表不一样长时发生错误要添加逻辑:
d1 = l1.val if l1 !=None else 0 取值处
l1 = l1.next if l1 != None else l1 遍历处
每次的sum就是新生成的元素
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
cur = 0
head = ListNode()
tail = head
while l1 != None or l2 != None or cur != 0:
d1 = l1.val if l1 !=None else 0
d2 = l2.val if l2 !=None else 0
sum = d1 + d2 + cur
cur = 1 if sum >= 10 else 0
sum = sum - 10 if sum >= 10 else sum
p = ListNode()
p.val = sum
tail.next = p
tail = tail.next
l1 = l1.next if l1 != None else l1
l2 = l2.next if l2 != None else l2
return head.next