leetcode题
前导知识:结构体变量不为指针,使用.来调用其成员;为指针使用->来调用其成员。
1. 两数之和
①difference[]=target - num[]中的数 单循环
②在num[]中寻找与difference[]相等但两者下标不等的数 双重循环 找到第一个后循环停止
2.两数相加
①初始化两指针head和tail置于空,用来指向和结点;初始化进位carry为0
②遍历l1和l2。若l1不空,n1为l1中的值;否则,n1为0。同理l2。令sum = n1 + n2 + carry(方便后续运算)。
若没有和链表,则头、尾指针都指向新生成结点(头指针不动,作为最终返回答案),尾指针指向的结点值为和的低位部分,尾next置空;
否则,新建下一个结点(尾next指向新生成结点),下一个结点值为和的低位部分,尾指针向后移动一位,尾next置空。
进位为和的高位部分;
遍历:如果l1不空,l1向后一位;同理l2。
③如果进位大于0(说明要创建新的结点来接纳这个进位值),则新建下一个结点,下一个结点值为进位,尾指针向后移动一位,尾next置空。
④返回头指针
总结:首先,相当于把两个链表值补齐到同一长度;其次,分开处理 和链表空和不空时 当前点的值,进位值不需要分开处理;最后,处理末尾的进位。
3.无重复字符的最长子串
①创建hash数组置为0(下标即代表字符的ascII码值,内容代表字符出现次数,使得字符与次数为映射关系)。数组开辟了128个空间,因为字母、数字或可显示字符在前128个ascII码值中。
②对字符串进行遍历。当前字符对应的hash数组值先增1。
若当前hash值>1,则将之前的未判断的字符到当前字符,这多个hash值都减一(使用while循环)。
当前max值与 i-j+1(即内部的无重复最长子串)比较,谁大,赋值给max(使用三目运算符简洁)。
③返回最大长度max
5.最长回文子串
回文子串的定义:任意一段子串是回文串。
中心扩展算法:每两个为一组向两侧扩展,找到最大的子串,返回其值
9.判断数字是否为回文数
①将数字转换为字符串
②使用双指针,一个指向前端,一个指向后端
③循环:当前端指针小于后端指针。若前端、后端数字不相等,返回false;否则,前端指针++,后端指针++
④正常就返回true
13.罗马数字转换为整数
算法1:从左到右遍历罗马数字,如果当前字符代表的数字小于下一个字符代表的数字,则减去当前字符代表的数字;否则,加上当前字符代表的数字。
算法2:
①使用字典,记录7种字符数值,6种特殊规则的值
②使用replace()方法将传入字符串任一的6种特殊规则字符替换成之前定义好的字符
③遍历传入字符串:累加
14.查找字符串数组中的最长公共前缀,如果不存在公共前缀,返回空字符串 ""
目的 | 步骤
算法1:利用python的max()和min(),在Python里字符串是可以比较的,按照ascII值排,举例abb, aba,abac,最大为abb,最小为aba。所以只需要比较最大最小的公共前缀就是整个数组的公共前缀
算法2:
①查找列表中最短字符串,其长度作为外循环的停止条件 |
初始化length等于第一个字符串长度;遍历列表,如果当前字符串小于length,则更新length。
②初始化pre为空字符,记录最长公共前缀
③外层循环控制字符索引,比较的长度为length;内层循环控制字符串索引,比较每个字符串相同索引的字符是否一样,比较完来到外层 | 内循环体:初始化flag为外层第i个字符,如果当前字符与flag不等则返回pre并结束内循环;外循环体:内循环体;pre添加flag的字符,因为flag是一个前缀字符
④返回pre值
20.有效括号:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
算法1:用replace来去除"()","[]","{}"
算法2:定义一个栈(列表)和字典,键为左括号,值为右括号。
遍历输入的字符串,如果是左括号,将其入栈;如果是右括号,判断栈是否为空,为空返回False;判断栈顶元素是否与之匹配,如果匹配则出栈,否则返回False。
如果遍历结束后栈为空,则说明匹配成功,返回True,否则返回False。
21.合并两个有序链表
①边界设置:如果list1空,返回list2;如果list2空,返回list1.(else不能乱用)
②初始化2个指针,一个指向头结点的指针l,一个滑动指针s辅助用的
③比较list1与list2的第一个结点值谁小,则L与s指向值小的结点
④遍历list1与list2,谁的结点小谁就放到s之后,s再指向末尾结点
⑤遍历完后,若A或B谁未空,谁就放在s之后
26.删除有序数组的重复项
①如果nums空,则返回0
②初始化k=1,记录唯一元素数量;初始化before=0与now=1,before为上一个元素的索引,now为当前元素的索引
③遍历有序数组(次数为数组长度减一),若当前元素与上一个元素相等,去除当前元素;否则,k += 1,before += 1,now +=1
④返回k
27.移除数组中所有数值等于val的元素
①初始化k=len(nums),记录数组的长度;初始化now=0,记录当前元素的索引
②遍历有序数组,若当前元素与val相等,删除当前元素,k -= 1;否则,now +=1
③返回k
35.搜索探查的位置。
①如果目标值大于数组末尾值,则返回末尾索引
②遍历数组,如果数组中找到目标值,则返回其索引
③遍历数组,若目标值是否小于数组值,则将目标值插入当前索引位置,返回索引
④返回0,因为这是判断当nums为空时返回0
58.最后一个单词的长度(较简单,未写)
66.数组加一
算法1:
①从后往前遍历数组,若数组当前元素不为9,则将当前元素加一,返回该数组;否则,当前元素为0,记录当前进位索引
②若索引为0,则将原数组多扩充一位,第一个元素为1,其余元素为0
③返回该数组
算法2:
①初始化sum=0,记录数组中组成的值有多大
②遍历数组,数组索引值×10的次方放入sum中
③sum自加1;数组中值全部归零
④当sum对10取整不为0时,数组中放入sum对10取余的数,并将sum对10取整放入数组中
⑤数组添加sum,因为这还是余数
⑥返回数组digits
67.二进制求和(较简单,未写)
*69.求x的平方根,只保留整数部分n(不能使用内置函数)
提示:除了0,1,任何x平方根的整数部分不会超过自身的一半
算法1:二分查找法
①对特殊值0,1进行处理
②初始化left=1, right=x/2,在区间[left, right]查找目标元素
③当left小于right,mid=(left + right +1)/2
如果mid的平方>x,则查找mid的左侧区间即right=mid-1
如果mid的平方<x,则查找mid的右侧区间即left=mid
否则就找到,就是自身,返回mid
④返回left
算法2:牛顿迭代法
数学原理:
①令r是f(x)=0的根,选任意x0作为r的初始近似值
②过( x0, f(x0) )做曲线f(x)=0的切线:y-f(x0) = f'(x0)(x-x0)
③令y=0, x=x1, 则x1=x0-f(x0)/f'(x0),称x1为r的第一次近似值
...
④再重复n次,有xn+1 = xn - f(xn)/f'(xn),可称为r的n+1次近似值
⑤即牛顿迭代公式:xn+1 = xn - f(xn)/f'(xn)
本题推理:
①令√r为所求数x的平方根,且为f(t) = t2 - r = 0的根(其中r就是x,换成r方便程序记录)
②选择t0 = r作为√r的初始近似值
因为f(t) = t2 - r = 0有两个零点。
如果取得数较小,可能会迭代到-√r。
所以选择t0 = r( r > √r),确保迭代到√r。
③最终有tn+1 = 1/2 * (tn + r/tn)
④当相邻两次迭代结果的差值 < 极小非负数ϵ(ϵ一般为10-7),迭代结束
算法:
①对特殊值0处理
②将r和t0初始化为浮点型,值都为x
③永真循环:ti = 1/2 * (t0 + r/t0)
若t0与ti的差值 < 1e-7(10-7),则跳出循环
t0 = ti
④返回int型ti
*70.爬楼梯
待定。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效