https://avatars.githubusercontent.com/u/42119758?v=4

davidlei blog

利用 vagrant 執行自己編譯的 kernel,快速搭建實驗環境

vagrant vagrant 是一款建立及管理虛擬機的工具,利用 vagrant 可以快速在本機端架設實驗環境,並且可以把自己習慣的環境包裝後在任何有安裝 vagrant 的電腦執行,達到 IaC(Infrastructure as Code) 的特性,使用 vagrant 可以大幅降低環境的架設時間,趁這個機會順便學習一下基本的用法。 這學期在修 linux 的課程會有添加 system call 或者改 kernel 的需求,所以這篇文章紀錄一下如何使用 vagrant 來執行自己編譯好的 kernel,以及一些 vagrant 的基本用法,用虛擬機做實驗也降低了把自己的環境搞壞的風險。 install 安裝可以參考 官方網站,在 ubuntu 的環境安裝 vagrant 可以用以下指令: $ curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add - $ sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" $ sudo apt-get update && sudo apt-get install vagrant $ vagrant plugin install vagrant-vbguest vagrant 只是一個管理虛擬機的工具,底層可以選擇 VirtualBox, VMware, AWS.. 等不同的虛擬機環境,在 linux 的主機中最方便安裝的就是 VirtualBox,所以在正式使用之前要記得先安裝 VirtualBox。

leetcode 876. Middle of the Linked List [Medium]

題目敘述 獲得 linked list 的 middle 節點。 經典的快慢指標問題,但是這題找到中間節點之後不需要前面的資料,所以直接用 head 來當 slow 指標。 解題流程 class Solution { public: ListNode* middleNode(ListNode* head) { ListNode *fast = head; while (fast && fast->next) { fast = fast->next->next; head = head->next; } return head; } };

leetcode 476. Number Complement [Medium]

題目敘述 對一個整數的有效位元做位元轉換(ones' complement),像是 5 = 101,經過轉換之後結果 2 = 010,前面沒有用到的 bit 則是不做任何操作。 思路 這題算是 Bit Manipulation 的入門題目,很適合練習 bit 的思考方式。剛好這類型的題目之前沒什麼做過,所以這邊來紀錄一下。 因為這題的範圍限制 1 <= num < 2^31,所以可確保第一個 bit 為0 找第一個有效位元 我的想法是先從左邊第一個 bit 開始找,找到第一個 1 ,後面所有的 bit 就都是有效位數,再一一反轉。 要判斷左邊第一個位元是不是 1 可以寫成 if ((num & (1 << 31)) == 1) { // do something } 可以利用這個方式先找到第一個 1 的所在,在對於後面的 bit 做反轉。 反轉 bits (一): 逐個 bit 反轉, 利用 XOR class Solution { public: int findComplement(int num) { bool flag = false; for (int shift = 31; shift >= 0; shift--) { if ((num & (1 << shift)) !

leetcode 198. House Robber [Medium]

題目敘述 看題目直覺想到是 dp 的題型,在一維陣列中取 n 個不相鄰的數字,使其有最大的總和。 這題算是基本的 dp 題型,本身不難想,底下的解答還能優化成使用 2 個變數去紀錄狀態。 解題紀錄 class Solution { public: int rob(vector<int>& nums) { if (nums.size() == 1) return nums[0]; int dp[100] = {0}; dp[0] = nums[0]; dp[1] = max(nums[0], nums[1]); for (int i = 2; i < nums.size(); ++i) { dp[i] = max(dp[i-1], dp[i-2]+nums[i]); } return dp[nums.size()-1]; } };

leetcode 973. K Closest Points to Origin [Medium]

題目敘述 給 n 個座標,返回距離原點最近的 k 個座標 解題紀錄 解法一 因為要返回的只有座標點,所以其實不需要開根號,直接用 (x^2 + y^2) 比較即可。 class Solution { public: vector<vector<int>> kClosest(vector<vector<int>>& points, int k) { sort(points.begin(), points.end(), [this](vector<int> &a, vector<int> &b) { return get_distance(a) < get_distance(b); }); return vector<vector<int>>(points.begin(), points.begin() + k); } inline int get_distance(vector<int> &point) { return point[0] * point[0] + point[1] * point[1]; } }; #pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") static auto _ = [] () {ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);return 0;}(); 解法二 求最近的 k 個節點,其實可以換個思路,利用 maxHeap 來實現。

leetcode 227. Basic Calculator II [Medium]

題目敘述 輸入算式的字串,返回解答。運算子只有 +, -, *, /,這題還沒有出現包含括號的情況。 解題紀錄 這次是直覺的用 stack 解出來,但是仔細思考過後發覺好像不一定要用 stack,可以用變數去存資料,之後待補XD class Solution { public: int calculate(string s) { long long int tmp; long long int num = 0; int len = s.size(); stack<long long int> result; char op_code = '+'; for (int i = 0; i < len; ++i) { if (isnumber(s[i])) { num = num * 10 + s[i] - '0'; } if (!isnumber(s[i]) && s[i] != ' ' || i == len-1) { switch (op_code) { case '+': result.