(听说第三届CCF-GAIR会在深圳举办啊,有点想去……看情况吧,但是仍然保证不鸽)
0059题 螺旋矩阵 II【Spiral Matrix II】
题目:
给定一个正整数 n,生成一个包含 1 到
所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
题目相对严谨
无需注意太多
解题思路:
这题就是上次螺旋矩阵的变形,而且还变简单了,如果变成m*n的话就真的直接改了,就不post代码了。
0060题 第k个排列【Permutation Sequence】
题目:
给出集合 [1,2,3,…,n],其所有元素共有
种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
- “123”
- “132”
- “213”
- “231”
- “312”
- “321”
给定 n 和 k,返回第 k 个排列。
说明:
给定 n 的范围是 [1, 9]。
给定 k 的范围是[1, n!]。
示例:
输入: n = 3, k = 3
输出: "213"
输入: n = 4, k = 9
输出: "2314"
题目相对严谨
需要注意:
1. 该题目的第k个是普通人的第k个,不是程序员的第k个,不从零开始计数,而是从1 :(
解题思路:
这题和之前第0046题几乎完全一样,貌似比那题还简单一些,参见这篇博文(https://blog.csdn.net/bright_silmarillion/article/details/80677824)
感觉仍然可以用回溯或者itertools来做,结果发现itertools竟然会TLE,我怀疑这个后台有问题,我在本地上跑的时间很短啊→_→,永远不相信在线的数据。
然后回溯也发现不行了,所以这道题变成一道找规律的题目了,真的有点意思,po上代码
class Solution:
def getPermutation(self, n, k):
p = [1]
for i in range(1, n+1):
p.append(p[i-1]*i)
digit = list("123456789")
num = n-1
res = ""
while num:
t = (k-1)//p[num]
k = k - t*p[num]
res += digit[t]
digit.remove(digit[t])
num -= 1
res += digit[k-1]
return res
(男人不能说自己快)
0061题 旋转链表【Rotate List】
题目:
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例:
输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL
输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL
题目相对严谨
链表题,小心驶得万年船
解题思路:
又到了用Python实现链表题的时候了,哇啦哇啦……不能摸,代码post在这里
import copy
class Solution:
def rotateRight(self, head, k):
if head == None or head.next == None:
return head
n = 0
p1 = head
while p1 != None:
p1 = p1.next
n += 1
if k % n == 0: return head
k %= n
p1 = head
for i in range(n-k-1): p1 = p1.next
h = p1.next
p1.next = None
t = h
while t.next != None: t = t.next
t.next = head
return h
0062题 不同路径【Unique Paths】
题目:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
说明:m 和 n 的值均不超过 100。
示例:
输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右
输入: m = 7, n = 3
输出: 28
题目相对严谨
除Robust以外无需注意太多
解题思路:
这个应该是和杨辉三角并列的,最为简单的数学规律动态规划之一的题目了,其实说是DP,不如说是一道纯数学题。
import math
class Solution:
def uniquePaths(self, m, n):
return math.factorial(m+n-2)//(math.factorial(m-1)*math.factorial(n-1))
然而math的代码实现竟然比直接编写阶乘函数更费时间……emmm根本不知道python是怎么想的╮(╯▽╰)╭