引子:
螺旋矩陣是乙個比較經典的演算法練習題。多數場景下要求練習者編寫程式按螺旋方式填充乙個邊長為n (n>0) 的二維整形陣列。如圖
另外,還有的是將1至於螺旋中心,或者逆時針方向演進的。之所以今天發文討論這個螺旋陣列,主要有以下幾點:
1、螺旋陣列是乙個經典習題
2、很多初級程式設計師至今沒有找到理想的解。
由於缺乏正確的程式設計「世界觀」,很多初級程式設計師無法獨立探尋比單純模擬更為巧妙地解,本系列也是為了總結一些常規的分析方法。
3、履行對園友的承諾
本人之前曾在園子裡承諾過要發布乙個能直接按座標計算對應值的螺旋矩陣演算法,結果遲遲沒有成文。並且本人有乙個解法至今在網上沒有看見有相同或類似的解。因此發布一下,為廣大演算法愛好者做貢獻。
4、為廣大被面試的同學出口惡氣
用螺旋陣列做面試題,我聽說過很多次。是不是在1小時內寫不出來就是水平差呢?我感覺未必,我會用努力證明所有現有的演算法都是有問題的,不優雅的。當你手握「標準」答案的時候,批評對方能力不足是太輕鬆的事情了。
場景簡介
大多數的題目是這樣的
常規思路
是人都知道這個螺旋矩陣裡面是有規律的,但是這規律卻也不是像列印星號直角三角形那麼容易發現。
因此多數程式設計師都是採用「直接模擬演算法」。
所謂直接模擬演算法,就是很直白得把問題中提出的需求直接用**方式模擬完成。
其實在多如牛毛的中小型專案中,用這種思路去實現客戶需求的做法不說100%吧,95%是一定的。這是乙個問題。
回到我們的這個需求,自然就是用乙個大迴圈產生1到n平方的所有整數,然後在迴圈體內精確地判斷矩形的四個邊界,並調整實際的x,y座標,然後對目標陣列的對應位置進行賦值
參考**
以下**收集自網路, 沒有驗證過
#include
#include
#define max_size 100
const
int intx= ;
const
int inty= ;
int main()
x+= intx[dir];
y+= inty[dir];
}for(i=0; ifor(j=0; jprintf("%d\t",arr[i][j]);
printf("\n");}}
void simulate(int n)演算法點評直接模擬演算法能解決很多問題,寫起來還特別快速.data[x][y] = num++;
}count++;
if(count == 2)
dir = (direction)((dir + 1) % 4);}}
優點
演算法思想直觀, 實現簡單, 在成功精確控制邊界變數時很有成就感。
缺點
計算機體系結構與程式效能
。我就是從那裡學來的。
但是
從園友 農夫三拳
2023年的文章 面試題-螺旋矩陣(模擬)
本篇總結
以下是個人牢騷,時間寶貴或不願意聽牢騷的情直接無視。
直接模擬演算法,是我們廣大程式設計師最熟悉的碼**的模式。而且它的確能勝任很多任務作場合。錯不在這個模式,在於我們的思維模式。
當思維模式成為思維定式,框死了我們的思想,從而感覺這個世界就是這樣的,編碼就是如此的,老子已經有5年編碼經驗了,老鳥了…..
那麼,不幸的是,我們已經失去進步的機會了。
有很多事情我們不敢做,要麼沒時間做,但是如果連想都不敢想,甚至從來沒主動嘗試去想。
那麼,沒有自主思想的人,就是機械人,難聽點的是殭屍。
螺旋陣列演算法[上篇]--直接模擬演算法
螺旋陣列演算法[中篇]--常規數學分析
螺旋陣列演算法[下篇]--努力接近需求的本質 預計12/23日發布
Shell演算法(上篇)
演算法 二分法查詢適用於資料量較大時,但是資料需要先排好順序。主要思想是 設查詢的陣列區間為array low,high 1 確定該區間的中間位置k 2 將查詢的值t與array k 比較。若相等,查詢成功返回此位置 否則確定新的查詢區域,繼續二分查詢。區域確定如下 a.array k t 由陣列的...
螺旋矩陣演算法
記得這是大二時,我的老師給我出的題,回去琢磨了半天,感覺不是很難。今天整理電腦裡的資料時發現了,拿出來看看,上網搜搜發現面試題裡挺多的,但網上的看起來比我的複雜得多 也許是個人感覺,我比較另類 所以拿出來分享。時間複雜度基本上就是o n 2 了。這個螺旋矩陣有幾類,我當時拿到的題是從中間往外順時針旋...
螺旋矩陣演算法
螺旋輸出1 25 public class sequence if row n col n row 1 col 1 array row n col 0 for int i 0 i n i system.out.println 矩陣轉換 public class testarray 建立乙個4行3列的...