Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
coding
python
提高你的代码水平上限 | 刷题日记2
发布于 2021-07-06 01:15:13 浏览:982
订阅该版
[tocm] July 6, 2021 @Author:lebhoryi@gmail.com @Language: Python > “真正的大师永远怀着一颗学徒的心” > ”要走出自己的舒适区“ > ”一定要自己独立完成,那怕写的再烂“ Leetcode 206:[https://leetcode-cn.com/problems/two-sum](https://leetcode-cn.com/problems/reverse-linked-list/)  反转链表。 开始撸这道题目的先决条件是:晓得链表是个啥玩意儿 科班出身的懂得都懂。但是我不是。这还是我后来恶补的知识。 ”大把的时间让我学我没学,到了不该学的年纪拼命学“ 除了上面一个知识点以外,对于 Python 写手来说,压根就没有链表这个数据结构。 咋办? 自己创建一个。 很巧妙的用了类方法,创建了类的节点的定义: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def __repr__(self): return str(self.val) ``` 并且上述方法都是默认写法,至少我没有见到过第二种,如果有,请评论留言或者私密我一下。 有了节点,还需要将列表转成节点:(此处借鉴了 leetcode 中的代码部分) ```python def string2ListNode(array): # 创建首节点 dummy_root = ListNode(0) ptr = dummy_root for elem in array: ptr.next = ListNode(elem) ptr = ptr.next return dummy_root.next ``` 好了,列表创建完成,但是,怎么检验列表创建成功? `print` 大法好 ```python def link_print(node): if not node.val: return None while node: yield node.val node = node.next ``` 完整的创建到输出: ```python def main(): head = [1, 2, 3, 5, 4] head = string2ListNode(head) for node in link_print(head): print(node, end=" ") ``` 别问为啥会出现 `yield`,`python` 开发者这个技巧哪能好意思叫做 `python` 开发... 还有就是上面类别中出现的 `__repr__`,目的是为了调试的时候,直接看到 `node`,而不用 `print(node.val)` 来查看,也可以不用,但是我习惯了用 更多的关于 `python` 和链表相爱相杀的代码:[https://github.com/Lebhoryi/Algorithms/tree/master/2.线性表](https://github.com/Lebhoryi/Algorithms/tree/master/2.%E7%BA%BF%E6%80%A7%E8%A1%A8) 文章:[https://blog.csdn.net/weixin_37598106/article/details/102224569](https://blog.csdn.net/weixin_37598106/article/details/102224569) --- 再回到题目中来,题目是反转链表,在对于链表的算法题来说是非常的基础, 同时也是非常的友好,对于初学者。 该题目也被纳入《剑指offer》中。 有以下两种解法: 1. 利用 `python` 的特性,将链表转换成列表,然后列表反转,再转换成链表 > 本文未实现,上面的 github 链接中有实现 2. 创建一个临时节点,将当前节点指向临时节点,临时节点更改为当前节点,然后当前节点往前移。 第二种的实现方式有**循环和递归**两种。 其中递归仅是拓展思维用,在内存和计算速度上均是循环更优。 这里介绍的是第二种解决方法: ```python def fun1(head: ListNode) -> ListNode: # 当前节点指向上一个节点 if not head or not head.next: return head ptr = None while head: tmp = head.next head.next = ptr ptr = head head = tmp return ptr def fun2(head: ListNode) -> ListNode: # 不算太优化的优化,省略tmp,python独有 if not head or not head.next: return head ptr = None while head: head.next, ptr, head = ptr, head, head.next return ptr def fun3(head: ListNode, ptr=None) -> ListNode: # 扩展思维:递归,凡是能够循环的都能够写成递归 # 此解法为尾递归,即直接以递归返回值作为结果,一般编译器会做优化,避免多余的函数开栈操作,实现效果相当于迭代 if head: head.next, ptr, head = ptr, head, head.next return fun3(head, ptr) if head else ptr ``` 科普一下 `python` 的优美之处,推荐掌握: ```python # a、b 互相交换 tmp = a a = b b = a # 可以写成 a, b = b, a ```
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
lebhoryi
这家伙很懒,什么也没写!
文章
30
回答
6
被采纳
1
关注TA
发私信
相关文章
1
请问我使用scons --target=mdk5命令出现下问题怎么解决
2
Python库的线程锁,在第一次执行后退出再次执行,就会断言死机
3
env 下脚本怎么实现编译的时候产生汇编文件
4
如何在RT-Thread中调用python程序?
5
编译固件前先执行python脚本
6
env还没支持python3吗?
7
import keras2onnx错误
8
求助大家,windows在ENV一打开就显示python停止运行是怎么回事?
9
使用RTthread Studio导入MDK工程报错
10
env工具链什么时候支持python3y呀
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
10
个答案
3
次被采纳
xiaorui
3
个答案
2
次被采纳
winfeng
2
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
lizimu
2
篇文章
9
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部