Python算法题集_两数相加

news2024/9/24 0:50:21

 Python算法题集_两数相加

  • 题2:两数相加
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【直接相加】
    • 2) 改进版一【对齐链表】
    • 3) 改进版二【数组求和】
  • 4. 最优算法

本文为Python算法题集之一的代码示例

题2:两数相加

1. 示例说明

  • 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

    请你将两个数相加,并以相同形式返回一个表示和的链表。

    你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    示例 1:

    img

    输入:l1 = [2,4,3], l2 = [5,6,4]
    输出:[7,0,8]
    解释:342 + 465 = 807.
    

    示例 2:

    输入:l1 = [0], l2 = [0]
    输出:[0]
    

    示例 3:

    输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
    输出:[8,9,9,9,0,0,0,1]
    

    提示:

    • 每个链表中的节点数在范围 [1, 100]
    • 0 <= Node.val <= 9
    • 题目数据保证列表表示的数字不含前导零

2. 题目解析

- 题意分解

  1. 本题为两个链表结构的数字求和
  2. 本题的主要计算有2处,1是链表遍历,2是数字求和
  3. 基本的解法是循环,链表1读一遍,链表2读一遍,所以基本的时间算法复杂度为O(m+n)

- 优化思路

  1. 通常优化:减少循环层次

  2. 通常优化:增加分支,减少计算集

  3. 通常优化:采用内置算法来提升计算速度

  4. 分析题目特点,分析最优解

    1. 链表1、链表2按顺序求和计算是标准的方式

    2. 如果对链表1、链表2的数据进行位置对齐,代码维护性会更好,性能也可能可以提升

    3. 可以用列表结构进行合并再转换为链表,看看效果


- 测量工具

  • 本地化测试说明:LeetCode网站测试运行时数据波动很大,因此需要本地化测试解决这个问题
  • CheckFuncPerf(本地化函数用时和内存占用测试模块)已上传到CSDN,地址:Python算法题集_检测函数用时和内存占用的模块
  • 本题很难超时,本地化超时测试用例自己生成,详见【最优算法章节】

3. 代码展开

1) 标准求解【直接相加】

链表直接求和,性能表现不错

性能优异,超越92在这里插入图片描述

import CheckFuncPerf as cfp

def addTwoNumbers_base(l1, l2):
 result = ListNode()
 sumtmp = 0
 lastnode = ListNode()
 result.next = lastnode
 while 1:
     sumtmp = (l1.val + l2.val + sumtmp) // 10
     valtmp = (l1.val + l2.val + sumtmp) % 10
     now = ListNode(valtmp)
     sumtmp = sumtmp
     lastnode.next = now
     lastnode = lastnode.next
     l1 = l1.next or ListNode(0)
     l2 = l2.next or ListNode(0)
     if (l1.next is None
             and l2.next is None
             and not sumtmp
             and l1.val == 0
             and l2.val == 0):
         break
 return result.next.next

result = cfp.getTimeMemoryStr(Solution.addTwoNumbers_base, head1, head2)
print(result['msg'], '执行结果 = {}'.format(result['result']))

# 运行结果
函数 addTwoNumbers_base 的运行时间为 158.03 ms;内存使用量为 16644.00 KB 执行结果 = <__main__.ListNode object at 0x000002115CF31860>

2) 改进版一【对齐链表】

将两个链表先对齐后,再进行求和

马马虎虎,超过69%在这里插入图片描述

import CheckFuncPerf as cfp

def addTwoNumbers_ext1(l1, l2):
 head = newnode = ListNode()
 len1, len2 = 0, 0
 l1_copy, l2_copy = l1, l2
 while l1.next: 
     len1 += 1
     l1 = l1.next
 while l2.next:
     len2 += 1
     l2 = l2.next
 if len1 > len2: 
     for iIdx in range(len1 - len2):
         l2.next = ListNode(0)
         l2 = l2.next
 elif len2 > len1:
     for iIdx in range(len2 - len1):
         l1.next = ListNode(0)
         l1 = l1.next
 sumtmp = 0
 while l1_copy: 
     valtmp = l1_copy.val + l2_copy.val + sumtmp
     sumtmp = valtmp // 10
     valtmp = valtmp % 10
     newnode.next = ListNode(valtmp)
     newnode = newnode.next
     l1_copy = l1_copy.next
     l2_copy = l2_copy.next
 if sumtmp == 1:
     newnode.next = ListNode(1)
 return head.next

result = cfp.getTimeMemoryStr(Solution.addTwoNumbers_ext1, head1, head2)
print(result['msg'], '执行结果 = {}'.format(result['result']))

# 运行结果
函数 addTwoNumbers_ext1 的运行时间为 129.03 ms;内存使用量为 16640.00 KB 执行结果 = <__main__.ListNode object at 0x000002115DF766D8>

3) 改进版二【数组求和】

将链表转换为数组,再求和转为链表,性能下降比较厉害

马马虎虎,超过66%在这里插入图片描述

import CheckFuncPerf as cfp

def addTwoNumbers_ext2(l1, l2):
 if l1 is None:
     return l2
 elif l2 is None:
     return l1
 list1, list2 = [], []
 while l1:
     list1.insert(0, l1.val)
     l1 = l1.next
 while l2:
     list2.insert(0, l2.val)
     l2 = l2.next
 num1, iunit = 0, 1
 for iIdx in range(len(list1)):
     num1 += list1[-iIdx-1] * iunit
     iunit *= 10
 num2, iunit = 0, 1
 for iIdx in range(len(list2)):
     num2 += list2[-iIdx-1] * iunit
     iunit *= 10
 num3 = num1 + num2
 list3 = str(num3)
 num3Node = ListNode(-100)
 headNode = num3Node
 for iIdx in range(len(list3)):
     num3Node.next = ListNode(int(list3[-iIdx-1]))
     num3Node = num3Node.next
 return headNode.next

result = cfp.getTimeMemoryStr(Solution.CheckFuncPerf, head1, head2)
print(result['msg'], '执行结果 = {}'.format(result['result']))

# 运行结果
函数 addTwoNumbers_ext2 的运行时间为 8411.89 ms;内存使用量为 17080.00 KB 执行结果 = <__main__.ListNode object at 0x000002115DF76358>

4. 最优算法

根据本地日志分析,最优算法为第2种addTwoNumbers_ext1

import random
nums1 = [random.randint(0, 9) for x in range(100000)]
nums2 = [random.randint(0, 9) for x in range(100000)]
def generateOneLinkedList(data):
    head = ListNode(-100)
    current_node = head
    for num in data:
        new_node = ListNode(num)
        current_node.next = new_node
        current_node = new_node
    return head.next, new_node
head1, tail1 = generateOneLinkedList(nums1)
head2, tail2 = generateOneLinkedList(nums2)
result = cfp.getTimeMemoryStr(Solution.addTwoNumbers_base, head1, head2)
print(result['msg'], '执行结果 = {}'.format(result['result']))

# 算法本地速度实测比较
函数 addTwoNumbers_base 的运行时间为 158.03 ms;内存使用量为 16644.00 KB 执行结果 = <__main__.ListNode object at 0x000002115CF31860>
函数 addTwoNumbers_ext1 的运行时间为 129.03 ms;内存使用量为 16640.00 KB 执行结果 = <__main__.ListNode object at 0x000002115DF766D8>
函数 addTwoNumbers_ext2 的运行时间为 8411.89 ms;内存使用量为 17080.00 KB 执行结果 = <__main__.ListNode object at 0x000002115DF76358>

一日练,一日功,一日不练十日空

may the odds be ever in your favor ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1439463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

相机图像质量研究(10)常见问题总结:光学结构对成像的影响--光圈

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

Quicker读取浏览器的书签(包括firefox火狐)

从edge换了火狐&#xff0c;但是quicker不能读取本地的bookmarks文件了&#xff0c;就研究了一下。 方法1&#xff1a;读取本地Bookmarks文件&#xff08;仅谷歌内核浏览器&#xff09; 谷歌内核的浏览器本地会有Bookmarks文件&#xff0c;放了所有的书签数据&#xff0c;直接…

我的docker随笔43:问答平台answer部署

本文介绍开源问答社区平台Answer的容器化部署。 起因 笔者一直想搭建一个类似stack overflower这样的平台&#xff0c;自使用了Typora&#xff0c;就正式全面用MarkdownTyporagit来积累自己的个人知识库&#xff0c;但没有做到web化&#xff0c;现在也还在探索更好的方法。 无…

MyBatisPlus基础操作之增删改查

目录 一、基本使用 1.1 插入数据 1.2 删除操作 1.3 更新操作 二、条件构造器Wrapper 2.1 常用AbstractWrapper方法 2.1.1 示例一 2.2.2 示例二 2.2.3 示例三 2.2 常用QueryWrapper方法 2.2.1 示例一 2.2.2 示例二 2.2.3 示例三&#xff08;常用&#xff09; 2.3 常…

PgSQL技术内幕 - case when表达式实现机制

PgSQL技术内幕 - case when表达式实现机制 CASE表达式如同 C语言中的if/else语句一样&#xff0c;为SQL添加了条件逻辑处理能力&#xff0c;可以根据不同条件返回不同结果。PgSQL支持两种语法&#xff1a;简单表达式和搜索表达式。 1、搜索表达式 语法如下&#xff1a; CASE WH…

android studio下开发flutter

文章目录 1. 配置环境 https://flutter.cn/docs/get-started/install2. android studio下开发flutter 1. 配置环境 https://flutter.cn/docs/get-started/install 2. android studio下开发flutter 打开Android Studio -> File -> Settings -> Plugins 搜索Dart插件 …

java_error_in_pycharm.hprof文件是什么?能删除吗?

java_error_in_pycharm.hprof文件是什么&#xff1f;能删除吗&#xff1f; &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;hprof格式文件介绍&#x1f333;&#x1f333;java_error_in_pycharm.hprof文件什么情况下能删除&#x1f333;&…

简化版SpringMVC

简化版SpringMVC web.xml xml version"1.0" encoding"UTF-8"?> <web-app version"2.5" xmlns"http://java.sun.com/xml/ns/javaee" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation&quo…

科技王座“座次变更”:英伟达超越亚马逊在即,距离谷歌也不远

英伟达的市值即将超过亚马逊&#xff0c;为二十年来首次。 截至2月7日收盘&#xff0c;英伟达市值达到1.73万亿美元&#xff0c;逼近亚马逊1.77万亿美元的市值&#xff0c;距离谷歌1.82万亿美元的市值也不远。 对人工智能的热情推升英伟达的股价去年以来一路飙涨&#xff0c;受…

【开源】基于JAVA+Vue+SpringBoot的新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

nginx登录用户验证配置

我们的nginx端口一般都是对外开放的&#xff0c;所以有一定程度上有被别人扫描的风险&#xff0c;所以为了减少被扫描的风险&#xff0c;我们可以配置一个nginx的用户登录验证&#xff1b; 用户验证登录需要nginx的一个模块&#xff1a;ngx_http_auth_basic_module 我们使用…

MySQL 时间索引的选择

背景 MySQL 在使用过程中经常会对时间加索引&#xff0c;方便进行时间范围的查询&#xff0c;常见的时间类型有 data、datetime、long、timestamp 等&#xff0c;在此分析下这几种时间类型的索引大小&#xff0c;以找到比较合适的时间类型。 时间类型对比 常用的索引类型是 …

SolidWorks学习笔记——入门知识2

目录 建出第一个模型 1、建立草图 2、选取中心线 3、草图绘制 4、拉伸 特征的显示与隐藏 改变特征名称 5、外观 6、渲染 建出第一个模型 1、建立草图 图1 建立草图 按需要选择基准面。 2、选取中心线 图2 选取中心线 3、草图绘制 以对称图形举例&#xff0c;先画出…

市场复盘总结 20240207

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 75% 最常用…

优化 IT 支出和消除浪费的 8 种主要方法

不懈追求最佳 IT 支出对于任何组织的长期可持续发展和成功都至关重要。在这个技术快速进步的时代&#xff0c;您必须做出明智的决策&#xff0c;消除浪费&#xff0c;同时最大限度地提高技术投资的价值。 从进行 IT 成本分析到采用敏捷预算和技术标准化&#xff0c;这些策略对…

算法学习——LeetCode力扣链表篇2

算法学习——LeetCode力扣链表篇2 24. 两两交换链表中的节点 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&…

C语言特殊指针

1 野指针 概念&#xff1a;指向一块未知区域的指针&#xff0c;被称为野指针。野指针是危险的。 危害&#xff1a; 引用野指针&#xff0c;相当于访问了非法的内存&#xff0c;常常会导致段错误&#xff08;segmentation fault&#xff09;引用野指针&#xff0c;可能会破坏系…

CRNN介绍:用于识别图中文本的深度学习模型

CRNN&#xff1a;用于识别图中文本的深度学习模型 CRNN介绍&#xff1a;用于识别图中文本的深度学习模型CRNN的结构组成部分工作原理 CRNN结构分析卷积层&#xff08;Convolutional Layers&#xff09;递归层&#xff08;Recurrent Layers&#xff09;转录层&#xff08;Transc…

day7(2024/2/8)

mainui.h(第二个界面) #ifndef MAINUI_H #define MAINUI_H#include <QWidget>namespace Ui { class MainUi; }class MainUi : public QWidget {Q_OBJECTpublic:explicit MainUi(QWidget *parent nullptr);~MainUi();public slots:void main_ui();private:Ui::MainUi *u…

【Godot4.2】文件系统自定义控件 - FileSystemTree

FileSystemTree B站【Godot4.2】文件系统自定义节点 - FileSystemTree 概述 在Godot设计编辑器插件或应用程序时&#xff0c;可能需要涉及文件系统的显示&#xff0c;比如文件夹或文件的树形列表。 我们可以用Godot的Tree控件快速书写相应的功能&#xff0c;但是为了复用到…