---
# System prepended metadata

title: 趨勢考古題

---

# 趨勢考古題

## 線上

1. 時鐘處理
 * 給定數字串，輸出排列最大的時間數字，不合法也要挑掉

基本上只能硬解，把排序全跑一次，取最大並且符合規則的。

2. 票價問題
 * 票類型有一天，七天，三十天的。 給定旅行日期取最小買票價格

用 dp 解，把不用的天數設為 INT_MAX ，要用的設為 0 ，第零天也設為 0
然後從第一天開始推，推出來的其實是到第幾天，如果這一天是不用旅行的，就直接把前一天的總票價 copy 過來。如果這一天要旅行，就把前面扣掉票價天數的 min 移過來，最後一天就是答案

coin problem 也可以用這個邏輯去解，只是改成該數字組成的最小硬幣數。

3. Graph 問題

[來自這裡](https://blog.little.tw/2018/09/26/%E6%96%B0%E9%AE%AE%E4%BA%BA%E9%9D%A2%E8%A9%A6part-ii-%E6%9E%9C%E5%AF%A6%E5%A4%A5%E4%BC%B4%EF%BC%8C%E8%B6%A8%E5%8B%A2%E7%A7%91%E6%8A%80/)

用 BFS 刷過去就可以

先建表，建表的部份要練習一下

4. 字串處理
無相關資料

## 現場筆試

[來自這裡](https://hackmd.io/@8ZS5TqpSS268IuLnUjTnyg/r1RugSvp-?type=view)

1. 搜尋 List 的時間複雜度  O(N) N = length
   搜尋 Binary Tree 的時間複雜度 O(logN) N = Node conut
   搜尋 Hash Table 的時間複雜度 O(1) ~ O(N) N = conflict time 
   
2. 講出以下輸出

```=c++
using namespace std;
class A{
public:
    A() { print(); }
    virtual void print() { cout << "in A" << endl; }
};
class B : public A{
public:
    B() { print(); }
    virtual void print() { cout << "in B" << endl; }
};
void main(void)
{
    B b;
}
```

output 
in A
in B

如果不加 public 會不能跑，建構子必須是 public 的但 class 預設所有東西都是 private 的

3. 給一段程式碼裡面包含一個 function(string *path) 此 function 的目的為將 Path 字串最尾端的”\\”刪除,然後問此段程式碼有何問題。(25%)

還沒試過

4. Link List 反轉, 不能使用任何額外記憶體 (25%)
我覺得應該是指 space complexity(1) 

如果 link list 是雙向跑的，跑到底然後用 xor 一路雙指標轉回來就好
如果是單向的，

1 -> 2 -> 3 -> 4

或是
    curNext = cur -> Next
    cur -> next = prev
    prev = cur
    cur = curNext

5. 寫一個函數, int findPosition (Node *root, int value),root 為一個二元搜尋樹, value 為 Node 的鍵值,這函數要回傳 value 在二元搜尋樹的中序追蹤為第幾個。

同綠皮書解答，必須要有往回的 


## 上場

### Q1
![](https://i.imgur.com/62pQt6v.png)
![](https://i.imgur.com/57ZrSnE.png)

```=c++
// 太簡單沒留
```

### Q2
![](https://i.imgur.com/SQmrCIi.png)
![](https://i.imgur.com/SmWnHfM.png)

```=c++
// you can use includes, for example:
// #include <algorithm>
#include <vector>
#include <string>
#include <iostream>

// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;

std::string solution(std::string &S, std::string &T) {
    // write your code in C++14 (g++ 6.2.0)
    // 統計每個文字數量就好， 只能換一次...所以不相等的話我想想，字母數量相同且只有兩個地方不同
    // 反之插入 -> 只能在尾
    // 不然移除
    // 差距只能為 1 不然都是 IMPOSSIBLE
    // a = 0, z = 25
    using namespace std;
    vector<int> cntS(26, 0);
    vector<int> cntT(26, 0);
    for (const auto& v : S) {
        cntS[v - 'a']++;
    }
    for (const auto& v : T) {
        cntT[v - 'a']++;
    }

    if (cntS == cntT) {
        // 只能是 swap or IMPOSSIBLE
        auto target = 0;
        auto diff = 0;
        for (auto i = 0; i < S.size(); ++i) {
            if (S[i] != T[i]) {
                diff++;
                target = i;
            }
        }
        return(diff == 2 ? (string("SWAP ") + T[target] + " " + S[target]) : "IMPOSSIBLE");
    }

    if (S.size() == T.size() - 1) {
        const auto result = T.compare(0, S.size(), S);
        return (result == 0 ? (string("INSERT ") + T.back()) : "IMPOSSIBLE");
    }

    if (S.size() == T.size() + 1) {
        const auto result = S.compare(1, S.size(), T);
        return (result == 0 ? (string("REMOVE ") + S.front()) : "IMPOSSIBLE");
    }

    return "IMPOSSIBLE";
}

int main()
{
    std::string input1("nice");
    std::string input2("nicer");
    std::cout << solution(input1, input2) << std::endl;
    input1 ="will";
    input2 ="ill";
    std::cout << solution(input1, input2) << std::endl;
    input1 ="late";
    input2 ="tale";
    std::cout << solution(input1, input2) << std::endl;
    input1 = "o";
    input2 = "odd";
    std::cout << solution(input1, input2) << std::endl;
}

```

### Q3
![](https://i.imgur.com/9UtuZvW.png)

```
#include <vector>
#include <iostream>
using namespace std;

int solution(int N) {
    // write your code in C++14 (g++ 6.2.0)
    // 開始推一下
    // 拆 10 + 1 * 10 + 1
    // 10 * 10 = 100 1 不變
    // 11 * 10 = 110 1 數量不變
    // 11 * 10 + 11 = 121 = -1 + 1
    // 121 * 10 + 121 = -2 +1 不能硬算最後會炸....
    // 用 digital 的數量推？用大數運算硬算嗎....好吧就這樣
    vector<int> cur{ 1,1 };
    if (N == 0) {
        return 1;
    }
    if (N == 1) {
        return 2;
    }

    while (--N) {
        const auto base = cur;
        cur.push_back(0);
        auto carry = 0;

        for (auto i = 0; i < base.size(); ++i) {
            *(cur.rbegin() + i) = *(cur.rbegin() + i) + *(base.rbegin() + i) + carry;
            carry = 0;
            if (*(cur.rbegin() + i) >= 10) {
                carry = 1;
                *(cur.rbegin() + i) = *(cur.rbegin() + i) % 10;
            }
        }
        *(cur.begin()) += carry;
        carry = 0;
        if (*(cur.begin()) >= 10) {
            *(cur.begin()) = *(cur.begin()) % 10;
            cur.insert(cur.begin(), 1);
        }
    }
    auto result = 0;
    for (const auto& v : cur) {
        if (v == 1) {
            result++;
        }
    }
    return result;
}

int main()
{
    for (auto i = 0; i < 101; ++i) {
        cout << solution(i) << ",";
    }
    cout << endl;
}
```

現場看了一下，一百分XDDD