第一題:
- 題目描述:
- 將長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
核心思路
- 先理解題意,第二行第一個的數字是指在0行0列上有幾個正方題疊加。
- 通過逐一的計算表面積,即一個位置上的表面積等於有幾個正方體6-2遮擋面。
- 用兩個for循環,外層爲i~N,內層爲j~M;當i=0且j=0時,總面積即此位置上的總面積;當i=0或j=0時,除了加上之前的表面積和此位置上的表面積,還應減掉兩個位置互相遮擋的面積;還有一種情況是不在i且不在j軸上位置應去掉跟i-1,j-1相貼的遮擋面。
詳細代碼:
舉一反三
點此可直達題目: LeetCode 892. 三維形體的表面積
參考答案
總結歸納:
- 一定要讀懂題目!一定要讀懂題目!一定要讀懂題目!
- 把整個區域的總表面積問題拆解成求一個個位置上的表面積之和
- 儘量減少多個for循環,以降低時間複雜度。
- 筆試時沒想明白的題筆試後一定要去查問並解決。
第二題:
- 題目描述:
- 在一個古老的國度,這個國家的人並不懂得進位,但是對取模情有獨鍾,因此誕生了一個經典的問題,給出兩個在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
核心思路:
- 將n個數字由多變少,用m位數組存儲,如num1[4]=2;num1[1]=3;num2[0]=1;num2[1]=1等等。
- 用兩個for循環,外層for由m-1到0表示兩組數的和;內層for由0到m-1遍歷num1數組。
- 當num1數組取j時,若要num2數組取k且(j+k)%m=i;則k=(i-j+m)%m以防i小於j的情況被忽略。
- 當(j+k)%m=i且num1[j]>0且num2[k]>0,比較num1[j]和num2[k]的大小,消去較小的值並把此值放入num3[i]中記錄兩組數的和。
- 當執行完一個內循環,i的個數已確定,此時可以直接打印,注意空格,設置count++,當打印最後一個數是不再打印空格。
詳細代碼:
總結歸納:
- 雖然有n個數字,但它們的範圍都是0~m-1,即有用的數字只有0~m-1。
- 在m進制下,最大數字爲m-1,所以應先找出m-1的解,再依次遞減。
- 儘量減少多個for循環,可用兩個已知值通過數學算式求出第三個值。
- 最重要的是做題時,不應該想了很多種解決方案,徘徊在方法裏卻沒有實現任一種。應想通解題思路,再去代碼實現。再去多找類似提醒去鞏固。
求:有沒有遇到上面兩道類似的題型可以留言哦,大家一起探討。