IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 两数之和(力扣刷题笔记) -> 正文阅读

[数据结构与算法]两数之和(力扣刷题笔记)

前言

本文是为了记录自己刷题的代码,以及之后优化所记的博客。

具体思路

最开始测试用的代码如下:

def addTwoNumbers(l1, l2):
    sp=list()
    flag=len(l1)+1
    for i in range(len(l1)):
        s_tmp=l1[i]+l2[i]
        if s_tmp>=10:
            s_tmp=s_tmp-10
            try:
                l1[i+1]=l1[i+1]+1
            except:
                flag=1
        sp.append(s_tmp)
        try:
            a=l1[flag]
            sp.append(1)
        except:
            pass
##    print(sp)
    return sp

l1 = [2,4,3]
l2 = [5,6,4]
addTwoNumbers(l1,l2)

思路上比较简单,逢十进一,最后一位的时候直接append(1)来实现最高位的加一处理,为了让最高位能够输出1,所以特意加了个flag,来做一个异常处理,在l1[flag]不走except位置的时候说明到了最高位,这时候加一即可。
之后为了将列表格式转为链表格式,所以看了看链表的基本操作:

# 声明链表类
class ListNode(object):
     def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
# 链表初始化
ListNode(0,head)
# 到下一个节点
p=p.next

之后利用类似的原理,做出了两个链表长度相同时候的解答:

class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        flag=0
        head=l1
        while(l1.next and l2.next):
            s_tmp=l1.val+l2.val
            if s_tmp>=10:
                s_tmp=s_tmp-10  
                l1.next.val=l1.next.val+1             
            l1.val=s_tmp
            l1=l1.next
            l2=l2.next
        # now is coming to the last one        
        final=ListNode(0,None)
        if l1.next and l2.next:
        l1.val=l1.val+l2.val
        if l1.val>=10:
            final.val=1
            l1.next=final
        print(head)
        return head

之后写了个创建新节点的类内函数,增加了一个判断从句,但是没考虑到连续进位的情况:

class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        head=ListNode(0,None)
        next_nodes=head
        while l1.next and l2.next:
            sums=l1.val+l2.val
            if sums>=10:
                l1.next.val=l1.next.val+1
                sums=sums-10
            next_nodes.val=sums
            next_nodes=self.addnode(next_nodes)
            print(head)
            l1=l1.next
            l2=l2.next
        if l1.next and not l2.next:
            next_nodes.val=l1.val+l2.val
            if next_nodes.val>=10:
                next_nodes.val=next_nodes.val-10
                l1.next.val=l1.next.val+1
            next_nodes.next=l1.next
        elif l2.next and not l1.next:
            next_nodes.val=l1.val+l2.val
            if next_nodes.val>=10:
                next_nodes.val=next_nodes.val-10
                l2.next.val=l2.next.val+1
            next_nodes.next=l2.next
        else:
            next_nodes.val=l1.val+l2.val
            if next_nodes.val>=10:
                next_nodes.val=next_nodes.val-10
                next_nodes=addnode
                next_nodes.val=1
        print(head)
        return head


    def addnode(self,cur):
        nxt=ListNode(0,None)
        cur.next=nxt
        return nxt

之后从第一个节点开始扫描,检测到一个大于十的节点就随之给它进位,题目通过,但是排名有点一言难尽:

class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        head=ListNode(0,None)
        next_nodes=head
        while l1.next and l2.next:
            sums=l1.val+l2.val
            if sums>=10:
                l1.next.val=l1.next.val+1
                sums=sums-10
            next_nodes.val=sums
            next_nodes=self.addnode(next_nodes)
            print(head)
            l1=l1.next
            l2=l2.next
        if l1.next and not l2.next:
            next_nodes.val=l1.val+l2.val
            if next_nodes.val>=10:
                next_nodes.val=next_nodes.val-10
                l1.next.val=l1.next.val+1
            next_nodes.next=l1.next
        elif l2.next and not l1.next:
            next_nodes.val=l1.val+l2.val
            if next_nodes.val>=10:
                next_nodes.val=next_nodes.val-10
                l2.next.val=l2.next.val+1
            next_nodes.next=l2.next
        else:
            next_nodes.val=l1.val+l2.val
            if next_nodes.val>=10:
                next_nodes.val=next_nodes.val-10
                next_nodes=self.addnode(next_nodes)
                next_nodes.val=1
        next_nodes=head
        while next_nodes:
            if next_nodes.val>=10:
                next_nodes.val=next_nodes.val-10
                try:
                    next_nodes.next.val=next_nodes.next.val+1                    
                except:
                    next_nodes=self.addnode(next_nodes)
                    next_nodes.val=1
                
            next_nodes=next_nodes.next
        print(head)
        return head


    def addnode(self,cur):
        nxt=ListNode(0,None)
        cur.next=nxt
        return nxt

不管是时间上还是内存上排名都比较靠后,可以进步的空间很大:
为了加一部分优化,从一部分开始就往后遍历,新添加了类内函数,修改后代码如下:

class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        head=ListNode(0,None)
        next_nodes=head
        while l1.next and l2.next:
            sums=l1.val+l2.val
            if sums>=10:
                l1.next.val=l1.next.val+1
                sums=sums-10
            next_nodes.val=sums
            next_nodes=self.addnode(next_nodes)
            print(head)
            l1=l1.next
            l2=l2.next
        if l1.next and not l2.next:
            next_nodes.val=l1.val+l2.val
            if next_nodes.val>=10:
                next_nodes.val=next_nodes.val-10
                l1.next.val=l1.next.val+1
            next_nodes.next=l1.next
            self.con_dec(next_nodes)
        elif l2.next and not l1.next:
            next_nodes.val=l1.val+l2.val
            if next_nodes.val>=10:
                next_nodes.val=next_nodes.val-10
                l2.next.val=l2.next.val+1
            next_nodes.next=l2.next
            self.con_dec(next_nodes)
        else:
            next_nodes.val=l1.val+l2.val
            if next_nodes.val>=10:
                next_nodes.val=next_nodes.val-10
                next_nodes=self.addnode(next_nodes)
                next_nodes.val=1
            
        next_nodes=head
       
        print(head)
        return head


    def addnode(self,cur):
        nxt=ListNode(0,None)
        cur.next=nxt
        return nxt


    def con_dec(self,cur):
        while cur:
            if cur.val>=10:
                cur.val=cur.val-10
                try:
                    cur.next.val=cur.next.val+1
                except:
                    cur=self.addnode(cur)
                    cur.val=1                        
            cur=cur.next

最后结果如下:
优化之后区别不是很大,效果并不显著…
在这里插入图片描述
总结:
虽然比较麻烦,而且结果还很差,但是还是记录一下这次的代码,之后再进行相应的优化。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 23:13:18  更:2022-07-04 23:14:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:26:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码