面試題 16.11. 跳水板
阿新 • • 發佈:2020-07-08
題目連結
題目分析
這個題其實就是給了我們兩種長度為shoter和longer的板子,要求我們合理的對其進行搭配,只要使用到的板子個數為k即可。
題目要求返回的長度是從小到大排列的。
那麼我們可以從最短的進行入手了,因為k個最短的板子肯定是會構成返回值中的第一個數,所以我們拿這個作為基數。
然後我們開始逐漸將短板一塊一塊換成長板,這樣構成的長度絕對就是遞增的了。
這個題要注意兩個邊界值:
- k為0的時候,我們需要返回空陣列。
- shorter和longer相等的時候,會產生相同的值,需要去重。
程式碼實現
程式碼一
程式碼一是我自己一開始做的,利用list存放我們得到的值,也保證了其相對順序。然後使用set來進行去重。
class Solution { public int[] divingBoard(int shorter, int longer, int k) { if(k == 0){ return new int[0]; } List<Integer> list = new ArrayList<>(); Set<Integer> set = new HashSet<>(); int sum = shorter; sum = sum * k; list.add(sum); set.add(sum); for(int i = 0; i < k; i++){ sum = sum - shorter + longer; if(set.contains(sum)){ continue; } list.add(sum); } int[] res = new int[list.size()]; for(int i = 0; i < list.size(); i++){ res[i] = list.get(i); } return res; } }
程式碼二
留意到這個題其實它的總長度是已知的,我們全部短板作為單獨的一項,後面進行了k項的替換,所以總長度是k+1。因此我們可以拋棄list這個容器。
同時我們也留意到重複的情況只有shorter和longer相等的時候才會出現,模板的總個數是寫死的,1+1+1 != 1+2,所以當我們遇到兩者相等的時候,直接返回短板之和即可。
class Solution { public int[] divingBoard(int shorter, int longer, int k) { if(k == 0){ return new int[0]; } if (shorter == longer){ return new int[]{shorter * k}; } int[] res = new int[k + 1]; int sum = shorter; sum = sum * k; res[0] = sum; for(int i = 0; i < k; i++){ sum = sum - shorter + longer; res[i+1] = sum; } return res; } }
總結
題目不難 ,但是優化很難。