随笔 - 1  文章 - 0  评论 - 0  阅读 - 22

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方便程序记录)

    ②选择t= 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.爬楼梯

待定。。。

posted on   LiuSunshine  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示