面試例題:看清以下數字排列的規律,設1點的座標為(0,0),x方向向右為正,y方向向下為正。例如,7的座標為(-1,-1),2的座標為(1,0),3的座標為(1,1)。程式設計實現輸入任何一點座標(x,y),輸出所對應的數字。
分析:1、按題目意思建立座標系,如下圖所示:
2、這個佇列是順時針螺旋向外擴充套件的,可以把它看成以
1點為中心一層一層往外延伸。如下圖所示:
3、設中間的1為第0層,2到9為第1層,10到25為第3層,依次類推,則:
規律1:第0層最大值為1(12),第1最大值為9(32),第2層最大值為25(52),則第t層最大值為(2*t+1)2。
規律2:第0層只有1,座標x=y=0,第一層座標滿足|x|=1&&|y|<=1或者|y|=1&&|x|<=1,則層數t=max(|x|,|y|)。
規律3:每一層都是乙個正方形,且邊長為2*t。
根據規律2,知道了層數,我們就知道所求的那點一定在第 t 層上,順著往下數就是了。要注意的就是螺旋佇列數值增長方向和座標軸正方向並不一定相同。我們可以分成四種情況,分別處於四條邊上來分析。
x = t,佇列增長方向和 y 軸一致,正東方向(y = 0)數值為 (2t-1)2 + t,所以 u = (2t-1)2 + t + y
y = t,佇列增長方向和 x 軸相反,正南方向(x = 0)數值為 (2t-1)2 + 3t,所以 u = (2t-1)2 + 3t - x
x = -t,佇列增長方向和 y 軸相反,正西方向(y = 0)數值為 (2t-1)2 + 5t,所以 u = (2t-1)2 + 5t - y
y = -t,佇列增長方向和 x 軸一致,正北方向(x = 0)數值為 (2t-1)^2 +7t,所以 u = (2t-1)2 +7t + x
(圖來自
)注意:其實還有一點很重要,不然會有問題。其它三條邊都還好,但是在東邊(右邊)那條線上,佇列增加不完全符合公式!注意到東北角(右上角)是本層的最後乙個數,再往下卻是本層的第乙個數,那當然不滿足x=t時的公式。所以我們把x=t的判斷放在最後,這樣一來,東北角那點始終會被認為是y=-t上的點。
**如下:
#include#includeusing namespace std;
int spiralqueue(int x,int y)
int main()
system("pause");
return 0;
}
《程式設計師面試寶典》讀書筆記 1
1.控制代碼和指標的區別和聯絡?控制代碼和指標是完全兩個不同的概念,控制代碼是個32bit unit,windows系統用控制代碼標記系統資源。指標只標記某個物理記憶體位址。控制代碼實際上是windows系統在記憶體維護的乙個物件記憶體實體地址列表的整數索引。因為windows系統的記憶體管理經常將...
《程式設計師面試寶典》讀書筆記 2
include int jug int x,int y else return x y int sub int x,int y void test int p int,int int x,int y vector,內部資料結構為陣列。隨機訪問每個元素所需要的時間為常量,在末尾增刪元素與元素數目無關,...
《程式設計師面試寶典》讀書筆記 4
針對繼承方面的知識點在進行簡單的總結 1.公有繼承方式 基類成員對其物件的可見性,公有成員可見而其他成員均不可見。基類成員對其派生類可見性,基類的公有成員和保護成員可見,私有不可見。基類成員對其派生類物件的可見性,基類公有成員可見。2.私有繼承方式 基類成員對其物件的可見性,公有成員可見而其他成員均...