1. 螺旋矩阵
1.1. 题目描述
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
1.2. 题目解析
和日常刷题(14) 里的螺旋数字矩阵思路一致。找到下一个位置,然后填数字即可。
1.3. 代码
class Solution:
def __call__(self, matrix: List[List[int]]):
def get_next_pos():
try:
di, dj = pos_list[0]
_i, _j = i + di, j + dj
assert _matrix[_i][_j] and _i > -1 and _j > -1
return _i, _j
except Exception:
pos_list.append(pos_list.pop(0))
return get_next_pos()
ans = []
_matrix = [[1 for _ in row] for row in matrix]
pos_list = [
(0, 1), (1, 0), (0, -1), (-1, 0),
]
i, j = (0, -1)
for _ in matrix:
for _ in _:
i, j = get_next_pos()
_matrix[i][j] = 0
ans.append(matrix[i][j])
return ans
2. 求解连续数列
2.1. 题目描述
已知连续正整数数列{K}=K1,K2,K3…Ki的各个数相加之和为S,i=N (0<S<100000, 0<N<100000), 求此数列K。
2.2. 输入描述
输入包含两个参数,1)连续正整数数列和S,2)数列里数的个数N。
2.3. 输出描述
如果有解输出数列K,如果无解输出-1。
2.4. 用例
输入 525 6
输出 85 86 87 88 89 90
说明 无
输入 3 5
输出 -1
说明 无
2.5. 题目解析
长度为n的连续数组的和可以表示为
S = k 1 + ( k 1 + 1 ) + . . . + ( k 1 + n − 1 ) S = k_1 + (k_1 + 1) + ... + (k_1 + n - 1) S=k1+(k1+1)+...+(k1+n−1)
将等式整理为:
S
=
n
k
1
+
n
(
n
−
1
+
0
)
2
S = n k_1 + \frac{n(n-1+0)} {2}
S=nk1+2n(n−1+0)
因此可以表示 k 1 k_1 k1为
k 1 = S − n ( n − 1 ) 2 n k_1 = \frac{S - \frac{n(n-1)} {2}} {n} k1=nS−2n(n−1)
只需要判断 k 1 k_1 k1是否为正整数即可。
2.6. 代码
class Solution:
def __call__(self, s: int, k: int):
k1 = (s - (k * (k - 1)) / 2) / k
if k1 <= 0 or k1 != int(k1):
return -1
return list(range(int(k1), int(k1) + k))