1 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
要求:假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
实例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解决办法:
首先想到的是两个for
循环,直接暴力查找,但是与要求不符,数组中同一个元素不能使用两遍。
于是可以用target
减去一个数,然后寻找另一个数的位置(要注意一个数不能用两边,也就是说[3,2,4,9],
查找target
,应该返回(1,2)
而不是(0,0)
).
也可以使用哈希表:在python中列表字典的即为哈希类型。(建一个新的字典,然后依次查找,如果不在字典内就继续查找)
class Solution(object):
def twoSum(self,s,target):
l = len(s)
for i in range(l):
t = target - s[i]
try:
a = s[i]
s[i] = ' '
j = s.index(t)
s [i] = a
return (i, j)
except ValueError as e:
if i == l-1:
raise 'No target'
else:
continue
2.两数相加
题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
首先时使用链表,python定义链表,也就是多一个属性next,当作指针,指针的移动是指向了下一个实例。
题目中是倒序存放也就是说,需要尾插法。
尾插法概念:
'每次向尾部插入,且需要两个指针都指向头节点,一个指针保持不动,一个指针随着插入节点不断移动,保持一直在最后一个节点'
C语言示例:
#LinkList L
int x;
L = (LNode*)malloc(sizeof(LNode));
LNode *s,*r=L;#s, r都指向头节点
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode)); //创建新的结点
s->Data=x;
r->Next=s;
r=s;#每次需要移动r指针,保持r指针在最后一个
scanf("%d",&x);#输入要插入节点的值
}
解决办法:
class ListNode(object):
def __init__(self,x):
self.val = x
self.next = None
class Solution(object):
def addTwoNumber(self,l1,l2):
#carry 用于同级节点的相加,也用于判断在链表下一个节点是否需要加1
#carry 记录最后是否需要增加新节点(最后首位统计相加之后超过10,
# 用divmod取进位的1,然后判断需要新增加节点存放1)
carry = 0
# 这里的执行顺序是res = ListNode(0), pre = res
res = pre = ListNode(0)
while l1 or l2 or carry:
#判断l1,l2是否为空,非空时再赋值
if l1:
#调用时需要定义l1的各个节点
#节点的赋值给carrry
carry += l1.val
l1 = l1.next
if l2:
#l1与l2同级节点的相加
carry += l2.val
l2 = l2.next
# divmod返回商与余数的元组,分别赋值给carry, val
carry, val = divmod(carry, 10)
#新建节点用于存放l1与l2同级节点的相加的值(不超过10的部分)
#pre.next = ListNode(val), pre = pre.next(尾插法,pre指针每次向后移动)
pre.next = pre = ListNode(val)
#res指针还处于头节点位置,因此每次返回res.next(但输出是需要每次移动res指针res = res.next)
return res.next
#外部调用时不会执行
if __name__ == '__main__':
#定义链表
l1 = ListNode(4)
l1.next = l11 = ListNode(5)
l11.next = l12 = ListNode(6)
l2 = ListNode(6)
l2.next = l21 = ListNode(4)
l21.next = l22 = ListNode(3)
res = Solution().addTwoNumber(l1,l2)
#输出
while res:
print(res.val)
res = res.next