收集python列表相关的题目
Ex: 计算素数(质数)
设计一个计算素数的函数
prime(n), 素数的个数小于等于n,
举个栗子: prime(17)=7, 因为前7个素数为2, 3, 5, 7, 11, 13, 17
1 | ''' |
1 | ''' |
Ex: 验证哥德巴赫猜想
1742年, 哥德巴赫提出了著名的哥德巴赫猜想. 即: 任一大于2的偶数都可以写成两个质数之和. 比如说16=3+13.
试着编码出程序: 只包含n作为参数, 并且给出n为两个质数之和的表达式.
哥德巴赫猜想至今没有被证明, 但是目前已知其在n<10^14的时候都是成立的.
1 | ''' |
Ex: 扫雷游戏
我们来写一个小程序:

程序接收三个参数,M,N和p,然后生成一个M * N的矩阵,然后每一个cell(小格子)有p的概率是地雷。生成矩阵后,再计算出每一个cell周围地雷的数量。
代码实现
1 | import random |
展示效果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 >. . . . . . . . . .
>. . . . * * . . . *
>. . . . . * * * * .
>. . . . . . * . * .
>. . . . . . . . . .
>. . . . . . . . . *
>. * . . * . * . . .
>. . . . * . . . . .
>. * . * . * . . . *
>* . . . . * . * . .
>
>0 0 0 1 2 2 1 0 1 1
>0 0 0 1 * * 4 3 3 *
>0 0 0 1 3 * * * * 3
>0 0 0 0 1 3 * 5 * 2
>0 0 0 0 0 1 1 2 2 2
>1 1 1 1 1 2 1 1 1 *
>1 * 1 2 * 3 * 1 1 1
>2 2 3 3 * 4 2 1 1 1
>2 * 2 * 4 * 3 1 2 *
>* 2 2 1 3 * 3 * 2 1
>
tips: 第7行代码是精髓, 有很多时候可以通过简单的方法来避免繁琐的边界判断过程
Ex: 矩阵0变换
给一个m×n的矩阵,如果有一个元素为0,则把该元素对应的行与列所有元素全部变成0。
1 | matrix = [ [ 1, 1, 1, 1, 1, 0, 1, 1, 1, 1 ], |
也就是变成这样 ↓
1 | matrix =[ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], |
思路1: 先想第一种, 我再去创建一个 m×n 的 数组(matrix), 然后这个数组里面专门存0的位置, 就是把0的位置设置为True;
这种方法需要用到额外mxn的空间→空间复杂度O(m×n)
思路2: 用set, 一个放行, 一个放列;
当然可以, 不过这个题先用列表来做
思路3: 我们是否需要维持(maintain)一个 m×n 的数组? 是可以不需要的; 只需要两个一维数组就够了, 一个maintain哪些列有0, 另一个maintain哪些行有0;
这种方法的空间复杂度为O(m+n) →space complexity
1 | def zero(matrix): |
1 | matrix = [ [ 1, 1, 1, 1, 1, 0, 1, 1, 1, 1 ], |
1 | # 原有matrix |
1
2
3
4
5
6
7 ># 输出
>[1, 1, 1, 1, 1, 0, 1, 1, 1, 1]
>[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
>[1, 1, 0, 1, 1, 1, 1, 1, 1, 1]
>[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
>[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
>
↓↓↓
1 | # 修改后matrix |
1
2
3
4
5
6
7 ># 输出
>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>[1, 1, 0, 1, 1, 0, 1, 1, 1, 1]
>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>[1, 1, 0, 1, 1, 0, 1, 1, 1, 1]
>[1, 1, 0, 1, 1, 0, 1, 1, 1, 1]
>
Ex: 九宫图
1 | def magic_square(n): |
1 | magic_square(3) |
1
2
3
4
5 ># 输出
>[4, 9, 2]
>[3, 5, 7]
>[8, 1, 6]
>
1 | magic_square(5) |
1
2
3
4
5
6
7 ># 输出
>[11, 18, 25, 2, 9]
>[10, 12, 19, 21, 3]
>[4, 6, 13, 20, 22]
>[23, 5, 7, 14, 16]
>[17, 24, 1, 8, 15]
>
Ex: 数独
给一个填好的数独,验证是否正确
1 | matrix = [ |
1 | def sudoku(matrix): |
1 | sudoku(matrix) |
1
2 > True
>
Ex: 旋转数组
给一个n×n的数组,顺时针旋转90度。
1 | ''' |
1 | matrix = [[i*5+j for j in range(5)] for i in range(5)] |
1
2
3
4
5
6 > [[0, 1, 2, 3, 4],
> [5, 6, 7, 8, 9],
> [10, 11, 12, 13, 14],
> [15, 16, 17, 18, 19],
> [20, 21, 22, 23, 24]]
>
1 | rotate(matrix) |
1
2
3
4
5
6 >[20, 15, 10, 5, 0]
>[21, 16, 11, 6, 1]
>[22, 17, 12, 7, 2]
>[23, 18, 13, 8, 3]
>[24, 19, 14, 9, 4]
>
1 | # in-place: 不使用额外空间, 在原有数组上进行修改 |
1 | matrix = [[i*5+j for j in range(5)] for i in range(5)] |
1
2
3
4
5
6 > [20, 15, 10, 5, 0]
> [21, 16, 11, 6, 1]
> [22, 17, 12, 7, 2]
> [23, 18, 13, 8, 3]
> [24, 19, 14, 9, 4]
>
Ex: 反转字符串
1 | def reverse(s): |
1 | s = "hello" |
‘olleh’
1 | def reverse2(s): |
1 | s = "hello" |
‘olleh’
Ex: 最大连续子串
给定一个数组,数组里有一个数组有且只有一个最大数,判断这个最大数是否是其他数的两倍或更大。如果存在这个数,则返回其index,否则返回-1。
Example:
Input: [1,1,0,1,1,1]
Output: 3
1 | def find_consecutive_ones(nums): |
1 | nums = [1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,0,0,1] |
4
Ex: 最大数
给定一个数组,数组里有一个数组有且只有一个最大数,判断这个最大数是否是其他数的两倍或更大。如果存在这个数,则返回其index,否则返回-1。
简化思路: 不需要将最大数与每个数都比较, 只要和第二大的数比较就行
1 | # O(n) time |
1 | nums = [1, 2,3,8,3,2,1] |
3
Ex: Find All Numbers Disappeared in an Array
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements of [1, n] inclusive that do not appear in this array.
Could you do it without extra space and in O(n) runtime?
You may assume the returned list does not count as extra space.
题目: 30s给爷找出列表中没了的数字
给定一个整数数组,其中1≤a[i]≤n(n=数组大小),有些元素出现两次,而另一些元素出现一次。
查找[1,n]中没有出现在此数组中的所有元素(包括[1,n])。
你可以在没有额外空间的情况下(抽屉原理否决)在O(N)运行时间内完成吗?
你可以假定返回的列表不算额外空间。
Example:
Input: [4,3,2,7,8,2,3,1]
Output: [5,6]
1 | # O(n^2) |
1 | nums = [4,3,2,7,8,2,3,1] |
[5, 6]
1 | def findDisappearedNumbersTest1(nums): |
1 | import time |
1 | random_lists = random_list(100) |
[([], 100, 0.0),
([], 200, 0.0),
([], 300, 0.0009765625),
([], 400, 0.0009758472442626953),
([], 500, 0.0009756088256835938),
([], 600, 0.0019519329071044922),
([], 700, 0.0039052963256835938),
([], 800, 0.004901885986328125),
([], 900, 0.004884481430053711),
([], 1000, 0.007781982421875),
([], 1100, 0.006831169128417969),
([], 1200, 0.009760379791259766),
([], 1300, 0.009790897369384766),
([], 1400, 0.014636039733886719),
([], 1500, 0.014640092849731445),
([], 1600, 0.014611959457397461),
([], 1700, 0.017599105834960938),
([], 1800, 0.019518375396728516),
([], 1900, 0.02632427215576172)]
1 | x = list(zip(*rst))[1] |

时间复杂度O(n^2)
1 | # 思路: 把下标当成数组, 出现过的数字下标会被改变, 没有改变的是缺失的数 |
1 | nums = [4,3,2,7,8,2,3,1] |
[5, 6]
1 | # O(n) |
1 | random_lists = random_list(100) |
[([], 100, 0.0),
([], 200, 0.0),
([], 300, 0.0),
([], 400, 0.0),
([], 500, 0.0009999275207519531),
([], 600, 0.0010001659393310547),
([], 700, 0.0009999275207519531),
([], 800, 0.0),
([], 900, 0.01399993896484375),
([], 1000, 0.0),
([], 1100, 0.0010001659393310547),
([], 1200, 0.0009999275207519531),
([], 1300, 0.0),
([], 1400, 0.0009999275207519531),
([], 1500, 0.0010001659393310547),
([], 1600, 0.0009999275207519531),
([], 1700, 0.0009999275207519531),
([], 1800, 0.0019998550415039062),
([], 1900, 0.0010004043579101562)]
1 | x = list(zip(*rst))[1] |

时间复杂度O(n)
Ex:Plus One
Given a non-negative integer represented as a non-empty array of digits, plus one to the integer.
You may assume the integer do not contain any leading zero, except the number 0 itself.
The digits are stored such that the most significant digit is at the head of the list.
翻译:
比如说有个digits = [1, 2, 3]
就需要得到: [1, 2, 4]
比如说有个digits = [9, 9, 9]
就需要得到: [1, 0, 0, 0]
1 | def plusOne(digits): |
1 | digits = [1, 2, 3] |
[1, 2, 4]
[1, 0, 0, 0]