---
# System prepended metadata

title: 2023 年「資訊科技產業專案設計」作業 2
tags: [資訊科技產業專案設計]

---

# 2023 年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2023/https%3A%2F%2Fhackmd.io%2F%40sysprog%2FS11ooE4Rh)」作業 2

> 鮪魚-maguro
> 問：interviewer
> 答：interviewee

[模擬面試錄影(漢)](https://youtu.be/XJcDPClxfdY)
### 改進方案&初步檢討
* Repeat: 重複提問，確認自己理解原本的要求
    * 重複提問的部分我向面試官確認了題目的細節，包括長、寬、高的統一以及計算方式，以至於後續的討論比較方便。
* Examples: 針對題目條件，舉出符合的案例，不限於特例
    * 我提出了一個範例，這邊可以方便後面撰寫題目來應用，沒做到的是試著提出edge case。
* Approach: 說明自己打算採用的方案
    * 說明後就急著寫code了，可以試著和 interviewer 討論。
* Code: 撰寫程式
    * 在寫程式時應盡量精簡講重點，避免冗言贅字，並且可以再加快打字速度。
* Test: 若不能實際測試，那說明驗證程式的方案
    * 無
## [11. Container With Most Water](https://leetcode.com/problems/container-with-most-water/description/)
### 過程的討論
<font color="#f00">
問：
這邊有個問題想請教你 假設公司要蓋一座污水處理池
這個污水處理池需要考慮它的深度以及它的寬度達到最大的儲存空間
那它的寬度呢會取決於左邊跟右邊這兩段距離
那它的高度呢會取決於左邊跟右邊這兩段牆壁的高度
那牆壁的高度左右兩邊會是不一定會是一樣高的
而是會有一個而是會考慮到呃該空間下可容納的極限高度
請你根據以下的條件寫一串程式碼得到的最大的儲存空間
</font>

答：
你好我想問一下題目的意思是說
我們目前的已知條件是左右兩邊的牆壁的高度是這樣嗎
<font color="#f00">
問：
啊是的也就是說你這邊可以決定的就是寬度以及高度
那長度的話這個部分已經是決定好的了
所以可以不用考慮進去
</font>
答：
那我想請問假設我最後決定的左邊的牆是高度是8
右邊的牆高度是6的話
這樣的話它的寬度是一嗎

那另外
左邊的牆跟右邊的牆位置不能重複也就是說我不能選兩個都是6
這樣的話它的寬度就會變成0
我的理解這樣是對的嗎
<font color="#f00">
問：
是的你的理解是對的
</font>
答：
好的
我想要用c語言來寫
所以在給陣列的同時必須給予陣列的長度

我要用的方法會是two pointer
因為這邊左邊的牆跟右邊的牆其實就是兩個index
那這兩個index在跑動的過程就蠻符合two pointer的想法

所以會有兩個變數一個叫left
那另外一個就叫做right
left就是從整串陣列的最左邊開始
那right就會是從陣列的右邊開始

area代表我自己要算的面積
那我最後會把面積的值也就是最大的面積值
告訴output然後由output來回傳

左邊的牆跟右邊的牆一定要保持
一定的寬度當寬度變成0的時候
我的搜尋就結束
因此我的迴圈會有一個終止條件

左邊跟右邊會先做高度的比較
比較矮的那個才會是我們這邊要的高度
有了高度之後我們就可以算面積
<font color="#f00">
*問：
好那你現在可以從你舉的例子來看
告訴我這樣最後會得到什麼樣的結果嗎*
</font>

答：
以上面的這個例子來看的話
這個範例的話最大值會是16
<font color="#f00">
問：
我看你的程式碼每一次的迴圈進行你都會計算一次面積
你總共花的時間複雜度大概是多少
那你每次的計算面積的話
有沒有辦法不這麼做然後讓時間更有效率
</font>
    
答：
時間複雜度因為整串的陣列我必須每一個每一個位置都輪過
所以時間複雜度是big o n

因為不計算面積的話可以用別的方式來去省略這個步驟
比如說去檢查它的高度比較矮的話我們就可以不用做
但其實這個步驟跟把面積算出來要花的時間是一樣的
所以並不需要去修改這樣的程式

### 程式碼
```cpp
int maxArea(int* height, int heightSize){
    int left = 0;
    int right = heightSize-1;
    int output = 0, area;
    while(left != right){
        int width = right - left;
        if(height[left] < height[right]){
            area = height[left] * width;
            left++;
        }            
        else{
            area = height[right] * width;
            right--;
        }

        if(area > output)
            output = area;
    }
    return output;
}
```
### 對於其他同學的評論 & 從中學到
* 不是直接放leetcode原題
    * 我自己和蠻多同學都有直接放leetcode題目的問題，所以我更改了一下題目敘述，變成汙水處理池容量的討論。
* Repeat: 重複提問，確認自己理解原本的要求
Examples: 針對題目條件，舉出符合的案例，不限於特例
    * 這兩點也是大部分人都沒做好的地方。我原本interviewee和interviewer的互動不夠多，這邊就是改成盡量提問。
* 舉例哪種語言、方法舉例
    * 有收到評論是優點有一開始就闡明要使用哪種語言來寫code，覺得蠻有道理的不同語言的特性會影響程式方法，所以使用哪種語言和方法舉例應該是相輔相成的。