一.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
(1)暴力算法,时间复杂度O(n2)
class Solution(object):
def twoSum(self, nums, target):
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if nums[i]+nums[j]==target:
return[i,j]
(2)哈希表,O(n)
class Solution(object):
def twoSum(self, nums, target):
n={}
for i,v in enumerate(nums):
if v in n:
return[n[v],i]
else:
n[target-v]=i
#把target-v当成值存入字典n,值为v的地址
#在后面遍历中n若有target-v,把字典中的值即前面的地址,和当前地址输出
二.
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
(1)class Solution:
def addTwoNumbers(self, l1, l2):
# 这里一开始不做l1、l2非空判断,题意表明非空链表
carry = 0 #存储l1+l2+之前的进位
# res = pre = ListNode(0),这里是创建头结点
res = ListNode(0)
pre = res
# 判断l1、l2、carry是否有值,carry有值的话需要增加新节点
while l1 or l2 or carry:
# 判断l1是否有值
if l1:
carry += l1.val #将l1加入c位
l1 = l1.next
# 判断l2是否有值
if l2:
carry += l2.val #将l2加入c位
l2 = l2.next
# carry有同级节点的和之前的进位
# divmod返回商与余数的元组,拆包为carry和val
#商为进位,更新给carry,让其与下个结点l1和l2相加
carry, val = divmod(carry, 10)
# 新建链表节点
# 这里是n.next = ListNode(val), n = n.next()
pre.next=ListNode(val) #次位的答案就是进位后的剩余,创造结点后放入
pre=pre.next
return res.next