# 趨勢考古題 ## 線上 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