1. 程式人生 > 實用技巧 >面試題 16.11. 跳水板

面試題 16.11. 跳水板

題目連結

面試題 16.11. 跳水板

題目分析

這個題其實就是給了我們兩種長度為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;
    }
}

總結

題目不難 ,但是優化很難。