免責事項: 個人的な学習目的、限定された容量、参照のみを目的としています。
1 つ目は、アイデアです。
最初の反応は、for ループを使用して解決する暴力的な解決策です。
試してみるとめまいがする
情報を確認した後は、基本的にコードを使いこなす能力を調べることになります。
時計回りに行列を描画するプロセスをシミュレートします。
1. 左から右へのアップリンク
2. 右列を上から下へ
3. 下流側右から左へ
4. 左の列を下から上に向かって進みます。
最初はN=3の例で囲みました。N=5 の例を自分で描くことをお勧めします。これは理解しやすいです----------ここで、時計回りに描画するたびに、初期点 x、y が +1 される必要があることを強調します。 、この操作で初期点を変更する必要があります。
この理解をここで紹介します。
これは、コーナーに遭遇するたびに、コーナーの点が新しい側に描画されることを意味します。
翻訳的には、これは左閉右開ルール[,)
コード
#螺旋矩阵
#
def generate_matrix(n):
nums = [[0] * n for _ in range(n)]
startx, starty =0, 0 #起始点
loop, mid = n//2, n//2 #迭代次数,n为奇数时,矩阵的中心点
count = 1 #计数
for offset in range(1, loop + 1): #每循环一层偏移量加1,偏移量从1开始
for i in range(starty, n - offset): #从左至右,左闭右开
nums[startx][i] = count
count += 1
for i in range(startx, n - offset): #从上至下
nums[i][n - offset] = count
count += 1
for i in range(n - offset, starty, -1): #从右至左
nums[n - offset][i] = count
count += 1
for i in range(n - offset, startx, -1): #从下至上
nums[i][starty] = count
count += 1
startx += 1
starty += 1
if n % 2 !=0: #n为奇数时,填充中心点
nums[mid][mid] = count
return nums
裏面に次のように書きます。
私が面接官だったら、反時計回りに印刷する場合はどうなるかと尋ねます。自分の考えについて話してください。