前言
这是我用python程序写的LeetCode官网题库里的一些相关算法,由于其官网的题目的相关解答很多以Java为主,而且有些没有答案,所以我把我自己用python写的程序写在下面,点击题目描述即可跳转到相应的题目,欢迎各路大神到我的留言板(GuestBook)下交流指点。
NO.1 两数之和(简单)
题目描述:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
大体意思就是给定一个数组,你输入数组中两数的任意一个和,程序需要返回这两个数在数组中对应的位置,python代码如下:
class Solution:
def twoSum(self, nums, target):
for i in range(len(nums)):
for j in range(i+1,len(nums)):
sum=nums[i]+nums[j]
if sum==target:
return i,j
但是这种方法效率真的太低了,所以我现在改用了字典的方法
class Solution:
def twoSum(self, nums, target):
numdict={}
length=len(nums)
for i in range(length):
numdict[nums[i]] = i
for i in range(length):
res = target - nums[i]
j = numdict.get(res)
if j != None and i != j:
return [i,j]
NO.2 两数相加(中等)
题目描述:给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。
说实话,看到链表我都是蒙的,因为太久没有接触过这个了,上次用链表应该是三年前的C语言课学了一点。于是我想着把链表强制转化为字符串进行操作,当然结果显而易见是错的,哈哈,不过我也实现了输入字符串转变成相应的加法结果的功能,然并没有什么用,对于链表的基础知识,我先后浏览了以下两个网址学习了一下链表的基础知识:
Python数据结构——链表的实现,Python中有关链表的操作(经典面试内容)
如果你仔细看了的话,我相信你对链表一定比较熟悉了,如果你觉得长没看也没关系,看了我的注释你一定会懂,首先我还是要说一下链表的基本概念:其是由一系列不必在内存中相连的结构构成,之所以不需要在内存中相连是因为链表中节点的结构其实是由元素和指针两部分构成,元素用来存储数据,指针用来指向下一个节点。代码如下:
class Solution:
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
p=res=ListNode(0)
#这里之所以创建一个头结点,是为了后面更方便的进行数据输出,括号里节点的值无所谓
carry=0 #进位
#这里的l1和l2是代表当前整个链表的,但其值是代表当前第一个节点的值
while l1 and l2:
sum=l1.val+l2.val+carry
value=sum%10
carry=sum//10 #代表整除,避免出现小数
p.next=ListNode(value)#将新节点连接到头节点之后
p=p.next #都是移到下一个节点再进行循环
l1=l1.next
l2=l2.next
rest=l1 or l2
"""
运行到这里的时候已经有一个链表为空了,所以rest实际就是取代另一个非空链表。由于我一直弄不懂两个链表的and和or有什么区别,我就自己用代码测试了一下,当两个长度不一样的非空链表相or时,新链表会变成在or左边的那个链表,无关长短,但有一个链表已经为空则除外,而and之后的新链表则会变成长的那个,这是直接赋值后的,但上述的while l1 and l2链表一直在变化,所以不满足这个,最后当其中一个链表为空集的时候就不满足循环条件了
"""
while rest:
sum=rest.val+carry
value=sum%10
carry=sum//10
p.next=ListNode(value)
p=p.next
rest=rest.next
if carry: #判断最后一位是否还产生了进位
p.next=ListNode(carry)
return res.next
"""
这里就显示了创建头结点的好处,因为p已经遍历到节点尾部,所以用res就可以进行输出,由于头结点不是我们想要的,所以从res.next开始输出
"""