這幾天參加面試,本來筆試比較簡單,但是在面試的時候,技術面試官說讓我現場寫乙個演算法,順時針列印矩陣的座標,如圖所示
順序為,0,1,2,3,4,9,14,19,24,23,22,21,20,15,10,5,6,7,8,13,18,17,16,11,12
假設 0的座標為(0,0),1的座標為(0,1),5的座標為(1,0)其他以此類推。
題目是列印出來順序的座標。
當場這道題我沒寫出來,後來面試官讓我回家寫,然後發到他的郵箱。回到家網上找了一下,也沒有好的解決方案,只好自己寫了。
總體思路採用乙個大迴圈控制,迴圈條件當前的最大縱座標不小於最小縱座標,並且當前小橫座標不小於最大橫座標時,迴圈終止,然後再按照上右下左的順序分四個小迴圈遍歷。
第一步:實現等高等寬的矩陣(x=y)的座標遍歷。
第二步:採用記錄標誌的方式改進,實現x!=y或x=y矩陣的遍歷。
第一步**實現:
1/**第二步的實現**:2* [printxy 順時針遍歷等高等寬矩陣座標]
3* @param integer $n [矩陣寬高]
4* @return string [座標字串]5*/
6function printxy($n=1) 724
$mintopx++;
2526
//當前右邊一行
27for($i = $mintopx; $i
<= $maxbottomx; $i++)
30$maxrighty--;
3132
//當前底部一行
33for($j = $maxrighty; $j >= $minlefty; $j--)
36$maxbottomx--;
3738
//當前左邊一行
39for($i = $maxbottomx; $i >= $mintopx; $i--)
42$minlefty++;43}
44return
$sortxy;45
}
1/**請大家指正。2* [printxy2 順時針遍歷矩陣座標]
3* @param integer $x [矩陣寬度]
4* @param integer $y [矩陣高度]
5* @return string [座標字串]6*/
7function printxy2($x=1,$y=1) 829
}30$mintopx++;
3132
//當前右邊一行
33for($i = $mintopx; $i
<= $maxbottomx; $i++) 38}
39$maxrighty--;
4041
//當前底部一行
42for($j = $maxrighty; $j >= $minlefty; $j--) 47}
48$maxbottomx--;
4950
//當前左邊一行
51for($i = $maxbottomx; $i >= $mintopx; $i--) 57}
58$minlefty++;59}
60return
$sortxy
;61 }
順時針列印矩陣
輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。例如 如果輸入如下矩陣 1 2 3 45 6 7 89 10 11 1213 14 15 16則依次列印出數字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。這個題目 寫的並不好感覺,好多if看著就煩,就是...
順時針列印矩陣
題目 給定乙個矩陣,從外向內順時針列印矩陣中的每乙個數字。例如 給定矩陣 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 輸出應該為 分析 這道題的意思非常直觀,給人的感覺也是so easy,然而實際去做的時候會發現,如果結構劃分的不好,會出現很多的迴圈,而且包括對各種...
順時針列印矩陣
from 題目 輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。例如 如果輸入如下矩陣 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次列印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。網上聽說聽到包括autod...