---
# System prepended metadata

title: 演算法 HW4
tags: [演算法]

---

# 演算法 HW4

## :book: 觀念題 

### 第一題 Selection Sort
* 請使用Selection sort排序，6,4,1,3,5。在四個回合中，每回合的Change of Flag數量為何？總共的Change of Flag數量為何？
    * **第一回合** ==6,4,1,3,5==
        flag change : 6->4->1 : 2次
            -> 1,4,6,3,5
    * **第二回合** ==1,4,6,3,5==
        flag change : 4->3 : 1次
        -> 1,3,6,4,5
    * **第三回合** ==1,3,6,4,5==
        flag change : 6->4 : 1次
        -> 1,3,4,6,5
    * **第四回合** ==1,3,4,6,5==
        flag change : 6->5 : 1次
        -> 1,3,4,5,6
**共 2+1+1+1=5 次**
### 第二題 Quick Sort 
:::info
左邊(i)找比基準點(pivot)大，右邊(j)找比基準點小。
若 i<j ，則 a~i~ ⇿ a~j~
若 i>j ，則 a~pivot~ ⇿ a~j~
:::
* 使用Quick排序7個數字，1,2,3,4,5,6,7，請說明每回合的pivot如何選擇，會有best case。請參考投影片33頁，畫出二元樹表示。
    ![](https://i.imgur.com/m0pC4Ql.png)

* 呈上題，請說明每回合的pivot如何選擇，會有worstcase。請參考投影片33頁，畫出二元樹表示。
    ![](https://i.imgur.com/fyn5kdb.png)

### 第三題 2-D Ranking Finding
* 平面上四個點，(1,1),(2,2),(3,3),(4,4)。請依照課本的方法，說明如何找出四個點的Ranking。(可配合畫圖表示)
    ![](https://i.imgur.com/EqUhI53.png)
    ![](https://i.imgur.com/YHKBPSj.png)
    ![](https://i.imgur.com/lyZkAmn.png)
    ![](https://i.imgur.com/LgNsX0Y.png)
    ![](https://i.imgur.com/argB4SA.png)

    * A(1,1) isn't dominated by any point -> rank(A)=0
    * B(2,2) is dominated by A -> rank(B)=1
    * C(3,3) is dominated by A,B -> rank\(C\)=2
    * D(4,4) is dominated by A,B,C -> rank(D)=3

##  :desktop_computer: 程式題 Two Pointers類型 (使用語言 : C++)

### 第四題 回文Palindrome

* leetcode 125
* 時間:30分鐘
* 自己完成的程度 : 完全靠自己
* 思路 : 
:::success
==i -> 由前往後
j -> 由後往前==

因為只需要判斷英文字母或是數字，所以利用isalnum()函式判斷是否為英文字母或數字，若不是則i++或j--。
當s[i]和s[j]都是數字或字母時判斷是否相同
* 若是，則重複上述動作。
* 若否，則直接回傳false。
:::
* 程式碼 :
```cpp==
class Solution {
public:
    bool isPalindrome(string s) {
        if(s.size()==1)
            return true;
        int j=s.size()-1;
        for(int i=0;i<s.size() && i<=j;i++)
        {
            while(!isalnum(s[i]) && i<j)
                i++;
            while(!isalnum(s[j]) && i<j)
                j--;
            if(tolower(s[i])!=tolower(s[j]))
                return false;

            else
                j--;
        }
        return true;
}
};
```
* 通過截圖
    ![](https://i.imgur.com/sbMY7xJ.png)
    
### 第五題 Linked List是否存在Cycle

* leetcode 141
* 時間:25分鐘
* 自己完成的程度：完全靠自己+老師給的提示
* 思路 : 
:::success
同老師給的提示，給定兩個指標，一快(前進2格)一慢(前進1格)，
判斷:
若有NULL出現，則表示沒有Cycle。
若快指標==慢指標，則表示有Cycle。
:::
* 程式碼:

```cpp==
class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode *list1=head;
        ListNode *list2=head;
        if(head==NULL)
            return false;
        else if(head->next!=NULL)
            list2=head->next;
        else
            return false;
        while(list1)
        {
            if(list1==list2)
                return true;
            if(list1->next==NULL || list2->next==NULL)
                return false;
            else if(list2->next->next==NULL)
                return false;
            list1=list1->next;
            list2=list2->next->next;
        }
        return false;
    }
};
```
* 通過截圖
    ![](https://i.imgur.com/nnL9LDT.png)

## :pushpin:心得

### 第六題 本週心得
本周影片，quick sort的二元樹表示的部分，覺得老師講的挺清楚的，也覺得好像懂了。但寫作業時卻又突然不知道要如何下手，因此有找了一下實際例子參考，發現其實不是不會，也不是聽不懂老師說的，只是第一次使用二元樹表示quick sort有點陌生。
這次作業跟以往不同的是，老師給了很多提示，當作業不知道如何下手時，這些提示真的幫助很大。

###### tags: `演算法`