360秋招2020屆筆試編程題(2019.8.15)--Binrry(冰蕊)

第一題:

  • 題目描述
  • 將長N*M釐米的矩形區域劃分成N行M列(每行每列的寬度均爲1釐米),在第i行第j列的位置上疊放Ai,j個邊長爲1釐米的正方體(1≤Ai,j≤100),所有正方體就組成了一個立體圖形,每個正方體六個面中的一部分會被其它正方體遮擋,未被遮擋的部分的總面積即爲該立體圖形的表面積,那麼該立體圖形的表面積是多少平方釐米?
  • [輸入] 第一行包含兩個整數N和M,1≤N,M≤1000。 接下來N行,每行包含M個整數,第i行的第j個整數表示Ai,j。
  • [輸出] 輸出表面積的大小。
  • [樣例輸入]
    2 2
    2 1
    1 1
  • [樣例輸出]
    20

核心思路

  1. 先理解題意,第二行第一個的數字是指在0行0列上有幾個正方題疊加。
  2. 通過逐一的計算表面積,即一個位置上的表面積等於有幾個正方體6-2遮擋面。
  3. 用兩個for循環,外層爲i~N,內層爲j~M;當i=0且j=0時,總面積即此位置上的總面積;當i=0或j=0時,除了加上之前的表面積和此位置上的表面積,還應減掉兩個位置互相遮擋的面積;還有一種情況是不在i且不在j軸上位置應去掉跟i-1,j-1相貼的遮擋面。

詳細代碼:
在這裏插入圖片描述

舉一反三
點此可直達題目: LeetCode 892. 三維形體的表面積
參考答案
在這裏插入圖片描述

總結歸納

  1. 一定要讀懂題目!一定要讀懂題目!一定要讀懂題目!
  2. 把整個區域的總表面積問題拆解成求一個個位置上的表面積之和
  3. 儘量減少多個for循環,以降低時間複雜度。
  4. 筆試時沒想明白的題筆試後一定要去查問並解決。

第二題:

  • 題目描述
  • 在一個古老的國度,這個國家的人並不懂得進位,但是對取模情有獨鍾,因此誕生了一個經典的問題,給出兩個在m進制下含有n位的數字,你可以分別將這兩個數各位上的數字重新排列,然後將兩個數按位對應相加並分別對m取模,這樣顯然可以得到一個新的m進制下的n位數(可能存在前導0),但是這個結果是不唯一的,問題來了,按照這樣的操作,能夠得到的最大的m進制下的數字是多少呢。
  • [輸入] 輸入第一行包含兩個正整數n,m分別表示數字含有n位,和在m進制下。(n,m≤100000)輸入第二行和第三行分別包含n個整數,中間用空格隔開,每個整數都在0到m-1之間。每行第i個數表示的是當前數第i位上的數字。
  • [輸出] 輸出包含n個數字,中間用空格隔開,表示得到的最大的數字,從高位到低位輸出,如6在2進制下輸出3位的結果是1 1 0。
  • [樣例輸入]
    5 5
    4 4 1 1 1
    4 3 0 1 2
  • [樣例輸出]
    4 4 3 3 2

核心思路

  1. 將n個數字由多變少,用m位數組存儲,如num1[4]=2;num1[1]=3;num2[0]=1;num2[1]=1等等。
  2. 用兩個for循環,外層for由m-1到0表示兩組數的和;內層for由0到m-1遍歷num1數組。
  3. 當num1數組取j時,若要num2數組取k且(j+k)%m=i;則k=(i-j+m)%m以防i小於j的情況被忽略。
  4. 當(j+k)%m=i且num1[j]>0且num2[k]>0,比較num1[j]和num2[k]的大小,消去較小的值並把此值放入num3[i]中記錄兩組數的和。
  5. 當執行完一個內循環,i的個數已確定,此時可以直接打印,注意空格,設置count++,當打印最後一個數是不再打印空格。

詳細代碼
在這裏插入圖片描述

總結歸納

  1. 雖然有n個數字,但它們的範圍都是0~m-1,即有用的數字只有0~m-1。
  2. 在m進制下,最大數字爲m-1,所以應先找出m-1的解,再依次遞減。
  3. 儘量減少多個for循環,可用兩個已知值通過數學算式求出第三個值。
  4. 最重要的是做題時,不應該想了很多種解決方案,徘徊在方法裏卻沒有實現任一種。應想通解題思路,再去代碼實現。再去多找類似提醒去鞏固。

求:有沒有遇到上面兩道類似的題型可以留言哦,大家一起探討。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章