数据结构与算法解题-20240422

在这里插入图片描述


这里写目录标题

  • 一、2. 两数相加
  • 二、67. 二进制求和
  • 三、415. 字符串相加
  • 四、LCS 01. 下载插件
  • 五、71. 简化路径

一、2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
在这里插入图片描述

迭代的思路是,初始化答案为一个「空链表」,每次循环,向该链表末尾添加一个节点(保存一个数位)。

循环即遍历链表 l1和l2, 每次把两个节点的值l1.val和l2.val与进位值carry相加,除以10的余数即为当前节点需要保存的数位,除以10的商即为新的进位值。

需要注意的是,在第一次循环时,我们无法往一个空节点的末尾添加节点。这里的技巧是,创建一个哨兵节点(dummy node),当成初始的「空链表」。循环结束后,哨兵节点的下一个节点就是最终要返回的链表头节点。

class S2:def func(self, l1, l2):cur = dummy = ListNode()  # 哑节点carry = 0  # 进位标记while l1 or l2 or carry:  # 如果有一个不是空节点,或者还有进位,就继续遍历L1 = l1.val if l1 else 0L2 = l2.val if l2 else 0sumL = L1 + L2 + carrycur.next = ListNode(sumL % 2)  # 每个节点保存一个数位sumL //= 10  # 新的进位cur = cur.next  # 下一个节点if l1:l1 = l1.nextif l2:l2 = l2.nextreturn dummy.next  # 哑节点的下一个节点就是头节点

二、67. 二进制求和

简单
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。

示例 1:
输入:a = “11”, b = “1”
输出:“100”

示例 2:
输入:a = “1010”, b = “1011”
输出:“10101”

提示:
1 <= a.length, b.length <= 104
a 和 b 仅由字符 ‘0’ 或 ‘1’ 组成
字符串如果不是 “0” ,就不含前导零

思路:
二进制字符串形式,不可以转化为int类型,因为可能溢出;
两个加数的字符串长度可能不同;
在最后,如果进位carry不为0,那么最后需要计算进位;
向结果字符串res拼接的顺序是向后凭借,返回时需要把res反转

class S67:def func(self, a, b):res = ''i = len(a) - 1j = len(b) - 1carry = 0while i >= 0 or j >= 0 or carry != 0:digitA = int(a[i]) if i >= 0 else 0digitB = int(b[j]) if j >= 0 else 0sumAB = digitA + digitB + carryif sumAB >= 2:carry = 1sumAB -= 2else:carry = 0i -= 1j -= 1res += str(sumAB)return res[::-1]r = S67()
a = "11"
b = "1"
print(r.func(a, b))

三、415. 字符串相加

简单
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”

示例 2:
输入:num1 = “456”, num2 = “77”
输出:“533”

示例 3:
输入:num1 = “0”, num2 = “0”
输出:“0”

class S415:def func(self,a,b):i=len(a)-1j=len(b)-1carry=0res=''while i>=0 or j>=0 or carry!=0:A=int(a[i]) if i>=0 else 0B=int(b[j]) if j>=0 else 0sumAB=A+B+carryif sumAB>=10:sumAB=sumAB%10carry+=1else:carry=0i-=1j-=1res += str(sumAB)return res[::-1]r=S415()
a = "11"
b = "123"
print(r.func(a, b))

四、LCS 01. 下载插件

简单
小扣打算给自己的 VS code 安装使用插件,初始状态下带宽每分钟可以完成 1 个插件的下载。假定每分钟选择以下两种策略之一:
使用当前带宽下载插件
将带宽加倍(下载插件数量随之加倍)
请返回小扣完成下载 n 个插件最少需要多少分钟。

注意:实际的下载的插件数量可以超过 n 个
示例 1:
输入:n = 2
输出:2
解释: 以下两个方案,都能实现 2 分钟内下载 2 个插件
方案一:第一分钟带宽加倍,带宽可每分钟下载 2 个插件;第二分钟下载 2 个插件
方案二:第一分钟下载 1 个插件,第二分钟下载 1 个插件

示例 2:
输入:n = 4
输出:3
解释: 最少需要 3 分钟可完成 4 个插件的下载,以下是其中一种方案: 第一分钟带宽加倍,带宽可每分钟下载 2 个插件; 第二分钟下载 2 个插件; 第三分钟下载 2 个插件。

class S01:def func(self, n):count = 0width = 1while width < n:width = width * 2count = count + 1count = count + 1return countr = S01()
n = 4
print(r.func(n))

五、71. 简化路径

中等
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,‘//’)都被视为单个斜杠 ‘/’ 。 对于此问题,任何其他格式的点(例如,‘…’)均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

始终以斜杠 ‘/’ 开头。
两个目录名之间必须只有一个斜杠 ‘/’ 。
最后一个目录名(如果存在)不能 以 ‘/’ 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…’)。
返回简化后得到的 规范路径 。

示例 1:
输入:path = “/home/”
输出:“/home”
解释:注意,最后一个目录名后面没有斜杠。

示例 2:
输入:path = “/…/”
输出:“/”
解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。

示例 3:
输入:path = “/home//foo/”
输出:“/home/foo”
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。

示例 4:
输入:path = “/a/./b/…/…/c/”
输出:“/c”

思路:将字符串按照/进行分割
分为4种情况
空字符串,
一个点 .
两个点 …
只包含英文字母、数字或者_的目录。

1、对于空【字符串】以及【一个点】,我们实际上无需对他们进行处理,因为【空字符串】没有任何含义,
2、而【一个点】表示当前目录本身,我们无需切换目录
3、对于【两个点】或者【目录名】,我们则可以用栈来维护路径中的每一个目录。
4、当遇到【两个点】时,需要将目录切换到上一级,因此只要栈不为空,我们就弹出栈顶的顶目。
当我们遇到【目录名】时,就把它放入栈

class S71:def func(self,path):names=path.split('/')stack=[]for name in names:if name == '..':if stack:stack.pop()elif name and name !='.':stack.append(name)return '/'+'/'.join(stack)r=S71()
path='/../'
print(r.func(path))

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3左树的全选和反选

<el-input v-model"filterText" placeholder"" style"width: 48%"/><el-button type"primary" click"handleSearch" class"ml-2">查找</el-button><el-radio-group v-model"form.choic…

“磁性蝴蝶”:创新结构纳米石墨烯能更精确控制自旋磁行为

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 深度好文&#xff1a;1300字丨7分钟阅读 摘要&#xff1a;新加坡国立大学的研究团队&#xff0c;开发出一种蝴蝶形磁性纳米石墨烯&#xff0c;包含四个具有铁磁和反铁磁相互作用的不…

【数据结构】二叉树链式结构的实现《遍历,实现》(题库+解析+源码)

前言 二叉树的学习离不开对堆的理解&#xff0c;这是上篇堆的传送门 http://t.csdnimg.cn/F6Jp3 1.二叉树链式结构的实现 1.1 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在大家对二 叉树结构掌握还…

《QT实用小工具·三十六》metro风格的主界面

1、概述 源码放在文章末尾 该项目实现了metro风格的主界面&#xff0c;包含访客登记&#xff0c;记录查询&#xff0c;证件扫描&#xff0c;信息打印&#xff0c;系统设置&#xff0c;系统重启等功能&#xff0c;项目demo演示如下所示&#xff1a; 源码下载

网络工程师---第十天

ARP表&#xff1a; 提起ARP表必然先想起ARP&#xff08;address resolution protocol&#xff09;协议&#xff0c;地址解析协议。 在实际应用中&#xff0c;我们经常遇到这样的问题&#xff1a;已知一个机器的IP地址&#xff0c;但在实际网络的链路上传送数据帧时&#xff0c;…

Ozone V3.32a使用总结

目录 前言 Ozone介绍 Ozone下载使用 总结 前言 由于项目需要&#xff0c;现在正在使用Ozone作为软件debug的工具&#xff0c;不同于Keil集成了代码编辑器&#xff0c;编译器&#xff0c;调试器&#xff0c;Ozone则主要作为一个代码调试工具使用。最近发现Ozone还有些功能挺…

嵌入式4-18

做一个简单数据库终端操作系统 #include <myhead.h> int main(int argc, const char *argv[]) {int id;char name[16];float score;sqlite3 *pNULL;if(sqlite3_open("./my.db",&p)!SQLITE_OK){printf("sqlite3_open error\n");return -1;} …

汇编语言作业(四)

目录 一、实验目的 二、实验内容 三、实验步骤以及结果 0.测试PPT中的下列程序&#xff1a; 1. 利用dos功能调用的01&#xff0c;07 或08号功能&#xff0c;从键盘输入一个数字字符并再调用02号功能将其输出&#xff1b;分析这三种功能调用的异同点 2.编写汇编程序&#x…

交换函数(值传递,地址传递,引用作为函数参数)

本段程序主要是完成值交换函数&#xff0c;包括基于值传递、基于地址传递以及引用作为函数参数三个子函数。 尤其值得关注如何把引用作为函数参数&#xff0c;进而实现数值交换。这一段的代码如下&#xff1a; void swap_y(int &a, int &b) {int temp a;a b;b temp…

目标检测——输电电塔绝缘子数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

CentOS7配置固定ip

一、打开配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 二、更改配置文件的参数 将BOOTPROTO的属性值改为static 或者是直接注销原来的重新写更改为静态的 三、在配置文件中设置ip地址和网关 1、IP地址的前三段需要和主机的 VMnet8 网卡的ip保持一致&#xff08;主…

Spring AI教程(二)Chat API之基于数据库的多Key轮询

基于数据库的多Key轮询 在之前的文章中我们所使用的Key都是一个&#xff0c;但事实上&#xff0c;官方对Key会有一定的请求限制&#xff0c;在实际业务场景下&#xff0c;我们也不可能通过一个Key来保证我们的系统稳定运行&#xff0c;因为一旦超过请求限制&#xff0c;就会出现…