LeetCode
  • Caisense的刷题笔记
  • BFS总结
  • DP总结
  • _sidebar
  • python初学问题总结
  • 二分总结
  • 回溯总结
  • 图总结
  • 堆总结
  • 好友问题
  • 并查集
  • 数组总结
  • 树总结
  • 滑动窗口总结
  • 递归总结
  • 链表总结
  • 1-200
    • 1. 两数之和
    • 10. 正则表达式匹配
    • 100. 相同的树
    • 101. 对称二叉树
    • 102. 二叉树的层次遍历
    • 103. 二叉树的锯齿形层次遍历
    • 104. 二叉树的最大深度
    • 105. 从前序与中序遍历序列构造二叉树
    • 106. 从中序与后序遍历序列构造二叉树
    • 107. 二叉树的层次遍历 II
    • 108. 将有序数组转换为二叉搜索树
    • 109. 有序链表转换二叉搜索树
    • 11. 盛最多水的容器
    • 110. 平衡二叉树
    • 111. 二叉树的最小深度
    • 112. 路径总和
    • 113. 路径总和 II
    • 114. 二叉树展开为链表
    • 115. 不同的子序列
    • 116. 填充每个节点的下一个右侧节点指针
    • 117. 填充每个节点的下一个右侧节点指针 II
    • 118. 杨辉三角
    • 119. 杨辉三角 II
    • 12. 整数转罗马数字
    • 120. 三角形最小路径和
    • 121. 买卖股票的最佳时机
    • 122. 买卖股票的最佳时机 II
    • 123. 买卖股票的最佳时机 III
    • 124. 二叉树中的最大路径和
    • 125. 验证回文串
    • 126. 单词接龙 II
    • 127. 单词接龙
    • 128. 最长连续序列
    • 129. 求根到叶子节点数字之和
    • 13. 罗马数字转整数
    • 130. 被围绕的区域
    • 131. 分割回文串
    • 132. 分割回文串 II
    • 133.克隆图
    • 134. 加油站
    • 135. 分发糖果
    • 136. 只出现一次的数字
    • 137. 只出现一次的数字 II
    • 139. 单词拆分
    • 14. 最长公共前缀
    • 140. 单词拆分 II
    • 141. 环形链表
    • 142. 环形链表 II
    • 143. 重排链表
    • 144. 二叉树的前序遍历
    • 145. 二叉树的后序遍历
    • 146.LRU缓存机制
    • 147. 对链表进行插入排序
    • 148. 排序链表
    • 15. 三数之和
    • 150. 逆波兰表达式求值
    • 151. 翻转字符串里的单词
    • 152. 乘积最大子序列
    • 153. 寻找旋转排序数组中的最小值
    • 154. 寻找旋转排序数组中的最小值 II
    • 155. 最小栈
    • 16. 最接近的三数之和
    • 160. 相交链表
    • 162. 寻找峰值
    • 164. 最大间距
    • 165. 比较版本号
    • 166. 分数到小数
    • 167. 两数之和 II - 输入有序数组
    • 168. Excel表列名称
    • 169. 求众数
    • 17. 电话号码的字母组合
    • 171. Excel表列序号
    • 172. 阶乘后的零
    • 173. 二叉搜索树迭代器
    • 174. 地下城游戏
    • 179. 最大数
    • 18. 四数之和
    • 187. 重复的DNA序列
    • 188. 买卖股票的最佳时机 IV
    • 189. 旋转数组
    • 19. 删除链表的倒数第N个节点
    • 190. 颠倒二进制位
    • 191. 位1的个数
    • 198. 打家劫舍
    • 199. 二叉树的右视图
    • 2. 两数相加
    • 20. 有效的括号
    • 200. 岛屿的个数
    • 21. 合并两个有序链表
    • 22. 括号生成
    • 23. 合并K个排序链表
    • 24. 两两交换链表中的节点
    • 25. k个一组翻转链表
    • 26. 删除排序数组中的重复项
    • 27. 移除元素
    • 28. 实现strStr()
    • 3. 无重复字符的最长子串
    • 30. 串联所有单词的子串
    • 31. 下一个排列
    • 32. 最长有效括号
    • 33. 搜索旋转排序数组
    • 34. 在排序数组中查找元素的第一个和最后一个位置
    • 35. 搜索插入位置
    • 36. 有效的数独
    • 37. 解数独
    • 38. 报数
    • 39. 组合总和
    • 4. 寻找两个有序数组的中位数
    • 40. 组合总和 II
    • 41. 缺失的第一个正数
    • 42. 接雨水
    • 43. 字符串相乘
    • 44. 通配符匹配
    • 45. 跳跃游戏 II
    • 46. 全排列
    • 47. 全排列 II
    • 48. 旋转图像
    • 49. 字母异位词分组
    • 5. 最长回文子串
    • 51. N皇后
    • 52. N皇后 II
    • 53. 最大子序和
    • 54. 螺旋矩阵
    • 55. 跳跃游戏
    • 56. 合并区间
    • 57. 插入区间
    • 58. 最后一个单词的长度
    • 59. 螺旋矩阵 II
    • 6. Z 字形变换
    • 60. 第k个排列
    • 61. 旋转链表
    • 62. 不同路径
    • 63. 不同路径 II
    • 64. 最小路径和
    • 66. 加一
    • 67. 二进制求和
    • 68. 文本左右对齐
    • 69. x 的平方根
    • 7. 整数反转
    • 70. 爬楼梯
    • 71. 简化路径
    • 72. 编辑距离
    • 73. 矩阵置零
    • 74. 搜索二维矩阵
    • 75. 颜色分类
    • 76. 最小覆盖子串
    • 77. 组合
    • 78. 子集
    • 79. 单词搜索
    • 8. 字符串转换整数 (atoi)
    • 80. 删除排序数组中的重复项 II
    • 81. 搜索旋转排序数组 II
    • 82. 删除排序链表中的重复元素 II
    • 83. 删除排序链表中的重复元素
    • 84. 柱状图中最大的矩形
    • 85. 最大矩形
    • 86. 分隔链表
    • 88. 合并两个有序数组
    • 89. 格雷编码
    • 9. 回文数
    • 90. 子集 II
    • 91. 解码方法
    • 92. 反转链表 II
    • 93. 复原IP地址
    • 94. 二叉树的中序遍历
    • 95. 不同的二叉搜索树 II
    • 96. 不同的二叉搜索树
    • 98. 验证二叉搜索树
    • 99. 恢复二叉搜索树
  • 1001-2000
    • 1002. 查找常用字符
    • 1005.K次取反后最大化的数组和
    • 1009. 十进制整数的反码
    • 1014. 最佳观光组合
    • 1034.边界着色
    • 1038.把二叉搜索树转换位累加树
    • 1078.Bigram分词
    • 1094.拼车
    • 1109.航班预订统计
    • 1135.最低成本联通所有城市
    • 1143. 最长公共子序列
    • 1154.一年中的第几天
    • 1218.最长定差子序列
    • 1254. 统计封闭岛屿的数目
    • 1312. 让字符串成为回文串的最少插入次数
    • 1361.验证二叉树
    • 1373.二叉搜索子树的最大键值和
    • 1446.连续字符
    • 1514.概率最大的路径
    • 1518.换酒问题
    • 1576.替换所有的问号
    • 1584.连接所有点的最小费用
    • 1610.可见点的最大数目
    • 1614.括号的最大嵌套深度
    • 1631.最小体力消耗路径
    • 1679.K和数对的最大数目
    • 1774.最接近目标价格的甜点成本
    • 1816.截断句子
    • 1854. 人口最多的年份
    • 1909. 删除一个元素使数组严格递增
    • 1952.三除数
  • 2001-3000
    • 2022.将一维数组转变成二维数组
    • 2073.买票需要的时间
    • 2074.反转偶数长度组的节点
    • 2075.解码斜向换位密码
    • 2076.处理含限制条件的好友请求
    • 2078.两栋颜色不同且距离最远的房子
    • 2079.给植物浇水
    • 2080.区间内查询数字的频率
    • 2085.统计出现过一次的公共字符串
    • 2086.从房屋收集雨水需要的最少水桶数
    • 2087.网格图中机器人回家的最小代价
    • 2099.找到和最大的长度为K的子序列
    • 2100.适合打劫银行的日子
  • 201-400
    • 201. 数字范围按位与
    • 202. 快乐数
    • 203. 移除链表元素
    • 204. 计数质数
    • 205. 同构字符串
    • 206. 反转链表
    • 207.课程表
    • 208.实现Trie(前缀树)
    • 209. 长度最小的子数组
    • 210.课程表 II
    • 211.添加与搜索单词-数据结构设计
    • 213. 打家劫舍 II
    • 216. 组合总和 III
    • 217. 存在重复元素
    • 219. 存在重复元素 II
    • 222. 完全二叉树的节点个数
    • 225.用队列实现栈
    • 226. 翻转二叉树
    • 229.求众数
    • 230. 二叉搜索树中第K小的元素
    • 231.2的幂
    • 232.用栈实现队列
    • 234. 回文链表
    • 235. 二叉搜索树的最近公共祖先
    • 236.二叉树的最近公共祖先
    • 237. 删除链表中的节点
    • 238. 除自身以外数组的乘积
    • 239.滑动窗口最大值
    • 240. 搜索二维矩阵 II
    • 242. 有效的字母异位词
    • 257. 二叉树的所有路径
    • 258. 各位相加
    • 260. 只出现一次的数字 III
    • 261.以图判树
    • 266.回文排列
    • 268. 缺失数字
    • 274. H 指数
    • 275. H 指数 II
    • 277.搜寻名人
    • 278. 第一个错误的版本
    • 280.Wiggle Sort
    • 283. 移动零
    • 287.寻找重复数
    • 290. 单词模式
    • 292. Nim游戏
    • 293.翻转游戏
    • 297. 二叉树的序列化与反序列化
    • 299.猜数字游戏
    • 300. 最长上升子序列
    • 301. 删除无效的括号
    • 303.区域和检索-数组不可变
    • 304. 二维区域和检索 - 矩阵不可变
    • 309. 最佳买卖股票时机含冷冻期
    • 312.戳气球
    • 318.最大单词长度乘积
    • 319.灯泡开关
    • 322.零钱兑换
    • 323.无向图中连通分量的数目
    • 328. 奇偶链表
    • 335.路径交叉
    • 337. 打家劫舍 III
    • 338. 比特位计数
    • 339.嵌套列表权重和
    • 342.4的幂
    • 344. 反转字符串
    • 346.数据流中的移动平均值
    • 349. 两个数组的交集
    • 350. 两个数组的交集 II
    • 354. 俄罗斯套娃信封问题
    • 359. Logger Rate Limiter
    • 364.加权嵌套序列和II
    • 366.寻找二叉树的叶子节点
    • 367.有效的完全平方数
    • 370.区间加法
    • 374.猜数字大小
    • 375.猜数字大小 II
    • 378.有序矩阵中第 K 小的元素
    • 383.赎金信
    • 384.打乱数组
    • 397.整数替换
    • 399.除法求值
  • 3001-4000
    • 3396.使数组元素互不相同所需的最少操作次数
  • 401-600
    • 406. 根据身高重建队列
    • 407.接雨水II
    • 413. 等差数列划分
    • 416. 分割等和子集
    • 419.甲板上的战舰
    • 423.从英文中重建数字
    • 430. 扁平化多级双向链表
    • 433. 最小基因变化
    • 438. 找到字符串中所有字母异位词
    • 440. 字典序的第K小数字
    • 442. 数组中重复的数据
    • 445. 两数相加 II
    • 450.删除二叉搜索树中的节点
    • 452. 用最少数量的箭引爆气球
    • 453. 最小移动次数使数组元素相等
    • 458.可怜的小猪
    • 460.LFU缓存
    • 461. 汉明距离
    • 462. 最少移动次数使数组元素相等 II
    • 463. 岛屿的周长
    • 475.供暖器
    • 476. 数字的补数
    • 484.寻找排列
    • 485. 最大连续1的个数
    • 488.祖玛游戏
    • 492.构造矩形
    • 494.目标和
    • 495. 提莫攻击
    • 496. 下一个更大元素 I
    • 500. 键盘行
    • 503.下一个更大元素II
    • 506.相对名次
    • 508. 出现次数最多的子树元素和
    • 509.斐波那契数
    • 513. 找树左下角的值
    • 515. 在每个树行中找最大值
    • 516. 最长回文子序列
    • 518. 零钱兑换 II
    • 520. 检测大写字母
    • 531.孤独像素I
    • 537. 复数乘法
    • 538.把二叉搜索树转换位累加树
    • 540. 有序数组中的单一元素
    • 542.01矩阵
    • 544.输出比赛匹配对
    • 547.省份数量
    • 553. 最优除法
    • 557. 反转字符串中的单词 III
    • 559.N叉树的最大深度
    • 560.和为K的子数组
    • 561. 数组拆分 I
    • 563.二叉树的坡度
    • 566. 重塑矩阵
    • 567. 字符串的排列
    • 575. 分糖果
    • 594.最长和谐子序列
    • 598.范围求和II
  • 601-800
    • 609. 在系统中查找重复文件
    • 617. 合并二叉树
    • 623. 在二叉树中增加一行
    • 627. 交换工资
    • 630.课程表III
    • 637. 二叉树的层平均值
    • 638.大礼包
    • 647. 回文子串
    • 648.单词替换
    • 652.寻找重复的子树
    • 653.两数之和IV-输入BST
    • 654. 最大二叉树
    • 657. 机器人能否返回原点
    • 669. 修剪二叉搜索树
    • 677.键值映射
    • 682. 棒球比赛
    • 684.冗余连接
    • 686.重复叠加字符串匹配
    • 690. 员工的重要性
    • 693. 交替位二进制数
    • 695. 岛屿的最大面积
    • 700.二叉搜索树中的搜索
    • 701.二叉搜索树中的插入操作
    • 704. 二分查找
    • 709.转换成小写字母
    • 714. 买卖股票的最佳时机含手续费
    • 723.粉碎糖果
    • 728. 自除数
    • 732. 我的日程安排表 III
    • 739.每日温度
    • 743.网络延迟时间
    • 748. 最短完整词
    • 752. 打开转盘锁
    • 754. 到达终点数字
    • 755. 倒水
    • 760.找出变位映射
    • 762. 二进制表示中质数个计算置位
    • 763. 划分字母区间
    • 766. 托普利茨矩阵
    • 785.判断二分图
    • 794.有效的井字游戏
    • 797.所有可能的路径
    • 799.香槟塔
  • 801-1000
    • 807.保持城市天际线
    • 817. 链表组件
    • 845. 数组中的最长山脉
    • 846.一手顺子
    • 851.喧闹和富有
    • 852. 山脉数组的峰顶索引
    • 859.亲密字符串
    • 869.重新排序得到 2 的幂
    • 876. 链表的中间结点
    • 886.可能的二分法
    • 887. 鸡蛋掉落
    • 911.在线选举
    • 990.等式方程的可满足性
    • 997.找到小镇的法官
  • 其他
    • dy一面笔试
  • 牛客网
    • 乌龟跑步
    • 向量平行
    • 堆栈中的剩余数字
    • 求最少的递减子序列个数及子序列
由 GitBook 提供支持
在本页
  • 1.注意浮点除法'/'和整数除法'//' 的区别
  • 2.注意整数除法与c语言的区别,c语言是向0取整,python是向下取整:
  • 3.注意取模运算python与c语言的区别:
  • 4.list和tuple的双冒号切片:
  • 5.逻辑运算符与c语言不同
  • 6.python中的三目运算符
  • 7.C++中的NULL,在Python中为None
  • 8.if判断语句为真或者假的情况:
  • 9.二维数组的创建和初始化
  • 10.in运算符还有对应的not in运算符
  • 11.py中的for循环内改变循环变量(i),并不会改变循环次数,而c++会改变次数。此外循环范围也不能改变(start,end)
  • 12. py中的多变量for循环(使用zip打包)
  • 13.列表表达式
  • 14.解包**(符号:*)
  • 15.and or表达式的进一步理解
  • 16.list(或tuple)之间的比较是字典序的:
  • 17.多个lambda式的写法
  • 18.list转dict
  • 19.dict初始化
  • 20.二进制表示
  • 21.可哈希和不可哈希的类型
  • 22.map函数
  • 23.集合(set)
  • 24.python set运算操作
  • 25.统计词频
  • 26.全局变量关键字global和nonlocal

python初学问题总结

1.注意浮点除法'/'和整数除法'//' 的区别

2.注意整数除法与c语言的区别,c语言是向0取整,python是向下取整:

先用浮点除法python计算5➗3的精确值:

>>> 5/3
1.6666666666666667
>>> -5/3
-1.6666666666666667

c语言整数除法:

5 / 3    //1
-5 / 3    //-1

python整数除法:

>>> 5 // 3
1
>>> -5 // 3
-2

由此可得结论,对于正数的整数除法,python与c的结果一样;对于负数则不一样。

3.注意取模运算python与c语言的区别:

具体分析: c语言:

5 % 3 = 2
-5 % 3 = -2

python:

5 % 3 = 2
-5 % 3 = 1

发现c语言和py中,-5对3取模,结果分别为-2和1。这两种结果都对,因为

-5 = 3 * (-1) + (-2)
-5 = 3 * (-2) + 1  #由于py向下取整,因此-5/3结果为-2

总结:对于正数,py与c语言取模结果一样;对于负数则不一样,一般c语言取模为负数,py为正

4.list和tuple的双冒号切片:

s[i:j:k]表示:切片第从i到j,间隔为1k

10以内的数,默认从开始到末尾,且间隔为1:

>>> range(10)[::]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

20以内的数,从第1到第18号,间隔为3

>>> range(20)[1:18:3]
[1, 4, 7, 10, 13, 16]

若k为负数,表示反向

>>> range(10)[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

k为-2,表示从0号开始,反向每2个元素取一个(第一个是0,第二个是9,第三个是8,第四个是7,以此类推......)

>>> range(10)[::-2]
[9, 7, 5, 3, 1]

注意:使用负数间隔时,若要自己指定起始范围,则范围应该也是反向的。 如:20以内的数,从10号开始,到0号结束,每次间隔为2

>>> range(20)[10:0:-2]
[10, 8, 6, 4, 2]

若范围与间隔不匹配,取到的切片为空

>>> range(20)[0:10:-2]  #范围是正向,而间隔反向,取不到
[]

5.逻辑运算符与c语言不同

c语言中与、或、非分别为&&、||和! 而py中为and、or和not 其他的比如==, >,>= ,!=等比较运算符相同

6.python中的三目运算符

python中没有其他语言中的三元表达式,不过有类似的实现方法 c++中三目运算符:

int a = 1;
int b = 2;
int c = a > b ? a : b;  //c等于a和b中的较大者

python中只有类似的替代办法,将if-else语句嵌套在赋值语句中:

a = 1
b = 2
c = a if a > b else b  #c等于a和b中的较大者

7.C++中的NULL,在Python中为None

None是一种特殊数据类型

>>>type(None)
<class 'NoneType'>

在判断表达式中,均为False:

f = None
if f:
	print("f is True")
else:
	print("f is False")

输出:f is False

8.if判断语句为真或者假的情况:

判断为True:只要x是非零数值(正数、负数)、非空字符串、非空list等(即为非None) 判断为False:数值0(包括负0:-0)和None、空字符串、空list等:

l = []  #空list
if l:
    print("True")
else:
    print("False")  #输出False
l = ""  #空串
if l:
    print("True")
else:
    print("False")  #输出False

9.二维数组的创建和初始化

首先介绍下*运算,对于一个整数,*表示乘法运算:

>>> m = 1
>>> m * 5
5

对于字符串和列表,*进行了重载,表示重复:

>>> m = "hello "
>>> m * 3  #字符串重复三遍,注意包括末尾空格
'hello hello hello '
>>> m = [0,1]
>>> m * 3  #列表重复三遍
[0, 1, 0, 1, 0, 1]

需要注意,若要构造嵌套列表,需要加上[]:

>>> m = [0,1]
>>> [m] * 3  #注意加上列表符号
[[0, 1], [0, 1], [0, 1]]

由此引出二维数组的第一种创建方式: 创建5*6的矩阵,初始为0

>>> n = [0] * 6  #创建列表[0, 0, 0, 0, 0, 0]
>>> matrix = [n] * 5  #创建5*6矩阵

终极简化版:

matrix = [[0]*6]*5
>>> matrix = [[0 for i in range(6)] for i in range(5)]  #注意内外层区别。

或者写作:

>>> matrix = [[0 for _ in range(6)] for _ in range(5)]  #因为i不用,可以用缺省符号‘_’代替

什么是列表推导式:

l1 = [ x for x in range(10) ]
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 创建0-9的列表

l2 = [ x + 1 for x in range(10) ]
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 创建1-10的列表


l3 = [ x for x in range(10) if x % 2 == 0 ]
# [0, 2, 4, 6, 8]
# 10以内偶数列表

然而实际使用时发现,第一种方式创建的二维数组,列方向上的元素会集体改变:

>>> dp = [[False] * 3] * 4
>>> dp  #3行4列bool数组,初始为FALSE
[[False, False, False], [False, False, False], [False, False, False], [False, False, False]]
>>> dp[1][2]=True
>>> dp  #发现第2列的全部变TRUE
[[False, False, True], [False, False, True], [False, False, True], [False, False, True]]
>>> dp[2][0]=True
>>> dp  #发现第0列的全部变TRUE
[[True, False, True], [True, False, True], [True, False, True], [True, False, True]]
>>> 

因此若二维数组之后还需使用的话,外层不能用*的方法构建,可以改为:

第三种方法:

matrix = [[0] * 6 for _ in range(5)]

10.in运算符还有对应的not in运算符

in运算符可以用于判断字符串是否包含另一个字符串,返回的是布尔值 同理not in可以用来判断字符串是否不包含另一个字符串,返回也是布尔值 因此没必要先用in然后在表达式前面加not了,直接not in。

11.py中的for循环内改变循环变量(i),并不会改变循环次数,而c++会改变次数。此外循环范围也不能改变(start,end)

看下面C++代码:

for (int i = 0; i < 10; i++) {
		cout << i << endl;
        if (i == 2) {
            i += 1;
        }        
    }

输出:

0
1
2
4
5
6
7
8
9

可以看到在i==2时,i增加了1,下一次for循环i加1,因此直接从4开始,跳过了i==3。循环只执行了9次! 而类似的py代码中:

for i in range(10): 
	print(i)
    if i == 2:      
        i += 1              

输出:

0
1
2
3
4
5
6
7
8
9

可以看到循环依然执行了10次,即i==2时虽然i增加1,但是下一次for循环依然从i=3执行。

结论:py中对for循环变量的修改不会影响到for的循环次数,也就是说,对循环变量的修改只在当前轮次内有效,不影响下一个循环

若要对循环变量进行修改,且下一轮仍有效,应该使用while循环。

对循环范围修改也是无效的,应改用while: https://blog.csdn.net/u012033124/article/details/79080631

12. py中的多变量for循环(使用zip打包)

c++中有如下形式:

for (int i = 0, j = 1, k = 2; i < 9, j < 9, k < 11; i++, j++, k++) {
    cout << i << " " << j << " " << k << " " << endl;
}

输出:

0 1 2 
1 2 3 
2 3 4 
3 4 5 
4 5 6 
5 6 7 
6 7 8 
7 8 9 //j先到达终点,然而并未停下
8 9 10

py中:

>>> for i,j,k in zip(range(9), range(1,9), range(2,11)):  #每次对三个变量分别循环,用zip打包,实际上是用for遍历zip
...    print(i,j,k)
... 
0 1 2
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
6 7 8
7 8 9  #j先到达终点,所有变量一起结束

可以看到c++与py的区别,当某一个变量到达终点时,py全部停止,而c++是继续,直到所有变量到达终点。

在这一题中有用到: https://blog.csdn.net/u012033124/article/details/80695353

13.列表表达式

[表达式 for 变量 in 列表]    或者  [表达式 for 变量 in 列表 if 条件]

顾名思义,列表(list)表达式包含一个list 详见:https://www.cnblogs.com/yupeng/p/3428556.html

14.解包**(符号:*)

https://blog.csdn.net/pfm685757/article/details/50464426

以上两点再这道题目第二种解法中展现得淋漓尽致: https://blog.csdn.net/u012033124/article/details/80515131

15.and or表达式的进一步理解

实际上是起到一个“短路”的作用 and:从左到右扫描,返回第一个为假的表达式值,无假值则返回最后一个表达式值。

>>> 1 and 0
0
>>> 0 and -1
0
>>> 2 and 4
4

or:从左到右扫描,返回第一个为真的表达式值,无真值则返回最后一个表达式值(因为真值是非0值,所以无真值一般只有全0的情况,返回假)。

>>> 2 or 3
2
>>> 3 or 0
3
>>> 0 or 0
0

https://blog.csdn.net/niuniuyuh/article/details/71213887

16.list(或tuple)之间的比较是字典序的:

先比较第一个元素,谁的大相应的list就大;相等则比较第二个元素,以此类推。。。

>>> (1, 9) < (2, 7)
True
>>> (2, 7) == (2, 7)
True
>>> (2, 7) < (2, 8)
True
>>> (-1, 7) < (0, 8)  #负数也适用
True
>>> (-2, 7) < (-1.5, 8)  #小数也是
True

因此按字典排序(第一位比第二位重要,第二位比第三位重要。。。),可以在sorted函数中的key参数使用lambda表达式:

>>> people
[[9, 0], [7, 0], [1, 9], [3, 0], [2, 7], [5, 3], [6, 0], [3, 4], [6, 2], [5, 2]]
#排序,按第一位降序,若第一位相等则第二位升序
>>> sorted(people, key=lambda x:(-x[0], x[1]))
[[9, 0], [7, 0], [6, 0], [6, 2], [5, 2], [5, 3], [3, 0], [3, 4], [2, 7], [1, 9]]

在这一题中有使用: https://blog.csdn.net/u012033124/article/details/79099404

17.多个lambda式的写法

        cal = {"+" : lambda x,y :x+y, "-" : lambda x,y : x-y, "*" : lambda x,y : x*y, "/" : lambda x,y : int(x/y)}
        #处理每个字符
        for t in tokens:
            if t in ops:  
                num1 = stack.pop()
                num2 = stack.pop()
                #注意运算顺序
                stack.append(cal[t](num2, num1))

https://cai-sen-se.gitbook.io/leetcode/150.-ni-bo-lan-biao-da-shi-qiu-zhi 实质上是用了字典,将四个lambda表达式作为值,四种运算符号作为键。

18.list转dict

list转map需要每个元素都为长度2的子list,转dict后第0个元素为key,第1个元素为value

>>> l = [[0,29],[1,34]]
>> dict(l)
{0: 29, 1: 34}

若有元素长度不符合:

>>> l = [[0,29,3],[1,34]]
>>> dict(l)
#报错

见 https://cai-sen-se.gitbook.io/leetcode/601-800/732.-wo-de-ri-cheng-an-pai-biao-iii

19.dict初始化

dict的key没有默认对应value(不像c++),因此遇到第一次出现的key时往往需要特殊处理 详见: https://cai-sen-se.gitbook.io/leetcode/~/edit/drafts/-Lav6nf8yvGNZMaYIw4t/601-800/609.-zai-xi-tong-zhong-cha-zhao-zhong-fu-wen-jian

20.二进制表示

c语言中是用补码,而py中使用原码加正负号表示:

 >>> bin(6)
'0b110'
 >>> bin(-6)
 '-0b110'		#-6的补码应该是1010
 >>> bin(~6)
'-0b111'		#6按位取反应该是1001

21.可哈希和不可哈希的类型

总结: (1)list、set、dict:是不可哈希的 (2)int、float、str、tuple:是可以哈希的 (3)list 不使用 hash 值进行索引,故其对所存储元素没有可哈希的要求;set / dict 使用 hash 值进行索引,也即其要求欲存储的元素有可哈希的要求。 (4)dict 仅对键(key)有可哈希的要求,对值(value)无此要求。

49题解法一用到 https://app.gitbook.com/@cai-sen-se/s/leetcode/1-200/49.-zi-mu-yi-wei-ci-fen-zu

22.map函数

map() 会根据提供的函数对指定序列做映射。

map(function, iterable, ...)

https://www.runoob.com/python/python-func-map.html 若function为基本数据类型(如int): 则将iterable中所有元素转为int 例如键盘输入5 19,读取并转换为两个整数:

a,b=map(int, input().split())
print(a,b)  #5,19
a=list(map(int, input().split()))
print(a)  #[5,19]

23.集合(set)

集合(set)是一个无序的不重复元素序列。

可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。 使用for表达式创建集合:

b = {x for x in range(5)}
print(b)  #{0, 1, 2, 3, 4}
c = set(x for x in range(5))
print(c)  #{0, 1, 2, 3, 4}

或不用for,直接range:

b = {range(5)}
print(b)

24.python set运算操作

对两个集合(set)的运算操作有差集(-)、交集(&)和并集(|):(注意没有加) 差集:

a = set(range(1, 10))    #{1,2, 3, 4, 5, 6, 7, 8, 9}
b = {0, 1}
a = a - b  #a集合有而b集合没有的
print(a)  #{2, 3, 4, 5, 6, 7, 8, 9}

交集并集:

>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}

25.统计词频

方法一(直观):

 map = dict()    #词频
    for c in t: 
        if c in map:   #先判断是否存在
            map[c] += 1
        else:
            map[c] = 1

https://app.gitbook.com/@cai-sen-se/s/leetcode/1-200/76.-zui-xiao-fu-gai-zi-chuan#jie-fa-yi 方法二(简洁):用get()

dict.get(key, default=None)
key -- 字典中要查找的键。
default -- 如果指定键的值不存在时,返回该默认值。
nums = [1,1,2,2,3,4]
d = {}  #字典
for i in nums:
    d[i] = d.get(i, 0) + 1  #若字典中不存在i,则i词频为1
print(d)  #{1: 2, 2: 2, 3: 1, 4: 1}

26.全局变量关键字global和nonlocal

函数调用外部变量,要在外部变量声明时和函数内部使用时,都声明global

def closedIsland(self, grid: List[List[int]]) -> int:
        #定义dfs辅助函数
        def dfs(grid, i, j):
            ...
            if grid[i][j] == 0 and (i == 0 or i == m-1 or j == 0 or j == n-1):
                global flag         #使用时也声明全局变量
                flag = False
                return
            ...
            dfs(grid, i, j+1)
        #调用dfs    
        m, n = len(grid), len(grid[0])  
        res = 0
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 0:
                    global flag      #定义时声明全局变量      
                    flag = True
                    dfs(grid, i, j)
                    if flag:
                        res += 1
        return res

或者只在内部使用时,声明nonlocal

def closedIsland(self, grid: List[List[int]]) -> int:
        #定义dfs辅助函数
        def dfs(grid, i, j):
            ...
            if grid[i][j] == 0 and (i == 0 or i == m-1 or j == 0 or j == n-1):
                nonlocal flag         #使用外部变量时声明
                flag = False
                return
            ...
            dfs(grid, i, j+1)
        #调用dfs  
        m, n = len(grid), len(grid[0])  
        res = 0
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 0:  
                    flag = True		  #定义时不用声明nonlocal
                    dfs(grid, i, j)
                    if flag:
                        res += 1
        return res
上一页_sidebar下一页二分总结

最后更新于2年前

第二种方式: 用先在[]中用for循环创建一个list,在外层[]继续用for循环创建list

列表推导式