天天看點

算法筆試模拟題精解之“疊疊高”

線上程式設計介紹

阿裡雲開發者社群線上程式設計産品,針對廣大開發者學習、實踐、面試、應聘、考試認證等打造的免費線上刷題神器。題庫來自筆試模拟題、算法大賽模拟題等,界面整潔明了,操作簡單,為使用者營造專心答題的學習環境。點選連結開始體驗:

https://developer.aliyun.com/coding

本文為大家介紹其中的 第133題:疊疊高 的題目解析,具體如下:

題目描述

等級:容易

知識點:數論

檢視題目:疊疊高

A同學買了n張卡片,他想用卡片來疊成一個塔,每層塔由數量不同的房間組成,且高層的房間數量必須少于低層的房間數量,房間可看做兩張傾斜的卡片組成,兩張卡片上面頭部相接觸。特殊的,每層的所有房間必須相鄰,且高層的房間需要建在天花闆上。

算法筆試模拟題精解之“疊疊高”

當n=13的時候隻有以上兩種方法去疊,但隻能疊高度為2的塔。

相鄰兩個房間之間用一張卡片作為天花闆相連。現在他想知道n張卡片全部使用的情況下他一共可以疊成多少種不同高度的塔。

輸入一個整數n(1 <= n <= 10^9),表示卡片數量;

輸出一個數字,可以疊成的高度的種類數。

示例1

輸入:

13

輸出:

1

解題思路:數學題

題目中問的是可以組成多少種不同高度的塔。

首先計算每種高度的塔至少需要多少張卡片,然後判斷多出來的卡片數與至少需要的卡片數之間的關系。

觀察下圖三層的塔。從上向下。

第一層一個房間,第二層兩個房間,……,第i層i個房間。

一個房間需要2張卡片,兩個房間需要5張卡牌(每個房間2張+天花闆1張),……,i個房間需要2i+i-1 = 3i-1張。

這樣每一層的卡片數都可以計算出來了,前k層的卡片數求和即可。記前k層最少需要f(k)張卡片

算法筆試模拟題精解之“疊疊高”

接下來觀察多餘卡片與房間的關系。下圖中圈出來的房間位置從1層放到了2層。是以,對于多出來的卡片,我們可以都放到第一層處理(因為題目隻問有多少種不同高度,而不是多少種不同的搭建方法)。

每多出來一間房,需要3張卡片(包括天花闆)。是以多餘的卡片為3的倍數,則這個高度的塔可以搭建。

算法筆試模拟題精解之“疊疊高”

計算過程

1、從第一層開始,計算f(i),直到f(i)大于K。

2、判斷每個f(i)與k的內插補點是否為3的倍數,是,則總數加1。

時間空間複雜度都很小。f(i)不需要一個數組來儲存,隻需要算出目前層的直接判斷是否為3的倍數即可。

看完之後是不是有了想法了呢,快來練練手吧>>

算法筆試模拟題精解之“疊疊高”

繼續閱讀