Amazon OA2 - Coding 20+題 C++

簡書原創(chuàng)钻蔑,轉(zhuǎn)載請聯(lián)系作者

// Right Rotation
bool rightRotation(string a, string b) {
    if (a.empty() || b.empty() || a.size() != b.size())
        return false;
    string x = a + a;
    return (x.find(b) != string::npos);
}
// Gray Code
// Two consecutive values differ in only one bit
bool grayCode(int a, int b) {
    int x = a ^ b;
    int count = 0;
    while (x) {
        x = x & (x - 1);
        count++;
    }
    return count == 1;
}
int grayCode(int a, int b) {
    const int W = sizeof(int) * 8;
    int x = a ^ b;
    int count = 0;
    for (int i = 0; i < W; i++)
        if ((x >> i) & 1)
            count++;
    return count == 1;
}
// Longest Palindromic Substring (LeetCode)
string longestPalindrome(string s) {
    const int n = s.size();
    bool f[n][n];
    for (int k = 0; k < n; k++) {
        for (int i = 0; i + k < n; i++) {
            int j = i + k;
            f[i][j] = (s[i] == s[j]) && (k <= 1 || f[i + 1][j - 1]);
        }
    }
    
    for (int k = n - 1; k >= 0; k--) {
        for (int i = 0; i + k < n; i++) {
            int j = i + k;
            if (f[i][j])
                return s.substr(i, j - i + 1);
        }
    }
    return "";
}
// Valid Parentheses (LeetCode)
bool isValid(string s) {
    stack<char> brackets;
    unordered_map<char, char> cache;
    cache[')'] = '(';
    cache['}'] = '{';
    cache[']'] = '[';
    for (char c : s) {
        if (c == '(' || c == '[' || c == '{')
            brackets.push(c);
        else if (c == ')' || c == ']' || c == '}') {
            if (brackets.empty() || brackets.top() != cache[c])
                return false;
            else
                brackets.pop();
        }
    }
    return brackets.empty();
}
// Topological Sorting
// Course Schedule (LeetCode)
// Detect Cycle in a Directed Graph <=> Topological Sorting for Directed Acyclic Graph (DAG)
// Topological Sorting for a graph is not possible if the graph is not a DAG.
// 1. 從有向圖中選取一個沒有前驅(qū)的頂點
// 2. 從有向圖中刪去此頂點以及所有以它為起始節(jié)點的邊
// 3. 重復(fù)上述兩步:圖空——拓撲排序成功奸鸯;圖不空,但找不到無前驅(qū)的頂點——有環(huán)
// 需要設(shè)一個數(shù)組inDegree[w]咪笑,記錄頂點的入度數(shù)
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
    vector<vector<int>> adjacency(numCourses);
    vector<int> indegree(numCourses);
    for (auto pre: prerequisites) {
        adjacency[pre.second].push_back(pre.first);
        indegree[pre.first]++;
    }

    queue<int> s; // 或者stack<int> s;
    for (int i = 0; i < numCourses; i++)
        if (indegree[i] == 0)
            s.push(i);
    int count = 0;
    while (!s.empty()) {
        int v = s.front(); // int v = s.top(); 對應(yīng)stack
        s.pop();
        count++;
        for (int u : adjacency[v]) {
            indegree[u]--;
            if (indegree[u] == 0)
                s.push(u);
        }
    }
    return (count == numCourses);
}
// Merge Two Sorted Lists (LeetCode)
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    ListNode dummy(-1);
    ListNode *p = l1, *q = l2, *r = &dummy;
    while (p && q) {
        if (p->val < q->val) {
            r->next = p;
            r = p;
            p = p->next;                
        } else {
            r->next = q;
            r = q;
            q = q->next;
        }
    }
    r->next = (p ? p : q);
    return dummy.next;
}
// Copy List with Random Pointer (LeetCode)
RandomListNode *copyRandomList(RandomListNode *head) {
    if (head == NULL)
        return NULL;
    unordered_map<RandomListNode*, RandomListNode*> cache;
    RandomListNode dummy(-1);
    RandomListNode *p = head, *q = &dummy;
    while (p) {
        q->next = new RandomListNode(p->label);
        q = q->next;
        cache[p] = q;
        p = p->next;
    }
    p = head;
    while (p) {
        if (p->random)
            cache[p]->random = cache[p->random];
        p = p->next;
    }
    return dummy.next;
}
// Reverse Linked List (LeetCode)
ListNode* reverseList(ListNode* head) {
    if (head == NULL || head->next == NULL)
        return head;
    ListNode *pre = head, *cur = head->next, *next;
    pre->next = NULL;
    while(cur) {
        next = cur->next;
        cur->next = pre;
        pre = cur;
        cur = next;
    }
    return pre;
}
// Reverse Second Half of Linked List
ListNode* reverseList(ListNode* head) {
    if (head == NULL || head->next == NULL)
        return head;
    ListNode *slow = head, *fast = head;
    while (fast->next && fast->next->next) {
        slow = slow->next;
        fast = fast->next->next;
    }
    
    ListNode *pre = slow->next, *cur = slow->next->next, *next;
    pre->next = NULL;
    while(cur) {
        next = cur->next;
        cur->next = pre;
        pre = cur;
        cur = next;
    }
    slow->next = pre;
    return head;
}
// Subtree of Another Tree (LeetCode)
bool isSubtree(TreeNode* s, TreeNode* t) {
    if (t == NULL)
        return true;
    if (s == NULL)
        return false;
    if (s->val == t->val && isSametree(s, t))
        return true;
    return isSubtree(s->left, t) || isSubtree(s->right, t);
}
bool isSametree(TreeNode* s, TreeNode* t) {
    if (s == NULL || t == NULL)
        return s == t;
    return (s->val == t->val) && isSametree(s->left, t->left) && isSametree(s->right, t->right);
}
// Two Sum (LeetCode)
vector<int> twoSum(vector<int>& nums, int target) {
    unordered_map<int, int> value_index_map;
    for (int i = 0; i < nums.size(); i++) {
        int desired = target - nums[i];
        if (value_index_map.find(desired) != value_index_map.end()) {
            vector<int> result = {value_index_map[desired], i};
            return result;
        }
        value_index_map[nums[i]] = i;
    }
}
// K-Nearest Points
// 時間復(fù)雜度:O(NlogK)
// 空間復(fù)雜度: O(K) 
struct Point {
    double x;
    double y;
    Point(double _x, double _y): x(_x), y(_y) {}
};

double squaredDistance(Point a, Point b) {
    return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
typedef bool (*cmp)(Point, Point);
Point global_origin = Point(0, 0);
bool compare(Point a, Point b) {
    return squaredDistance(a, global_origin) < squaredDistance(b, global_origin);
}

vector<Point> kNearestPoint(vector<Point> points, Point origin, int k) {
    global_origin = origin;
    priority_queue<Point, vector<Point>, cmp> pq(compare);
    for (int i = 0; i < points.size(); i++) {
        pq.push(points[i]);
        if (i >= k)
            pq.pop();
    }
    vector<Point> res;
    for (int i = 0; i < k; i++) {
        res.push_back(pq.top());
        pq.pop();
    }
    return res;
}
// Overlap Rectangle
bool overlapRectangle(Point l1, Point r1, Point l2, Point r2)
{
    // If one rectangle is on left side of other
    if (l1.x > r2.x || l2.x > r1.x)
        return false;
    // If one rectangle is above other
    if (l1.y < r2.y || l2.y < r1.y)
        return false;
    return true;
}
// Search a 2D Matrix II (LeetCode)
// Integers in each row are sorted in ascending from left to right.
// Integers in each column are sorted in ascending from top to bottom.
bool searchMatrix(vector<vector<int>>& matrix, int target) {
    if (matrix.empty() || matrix[0].empty())
        return false;
    const int n = matrix.size(), m = matrix[0].size();
    int i = n - 1, j = 0;
    while (i >= 0 && j < m) {
        if (matrix[i][j] == target)
            return true;
        else if (matrix[i][j] > target)
            i--;
        else
            j++;
    }
    return false;
}
// 3Sum Closest (LeetCode)
// 左右夾逼
int threeSumClosest(vector<int>& nums, int target) {
    int diff = INT_MAX, result;
    sort(nums.begin(), nums.end());
    for (int i = 0; i < nums.size() - 2; ++i) {
        int j = i + 1, k = nums.size() - 1;
        int cur_target = target - nums[i];
        while (j < k) {
            if (abs(nums[j] + nums[k] - cur_target) < diff) {
                diff = abs(nums[j] + nums[k] - cur_target);
                result = nums[i] + nums[j] + nums[k];
            }
            if (nums[j] + nums[k] < cur_target)
                j++;
            else if (nums[j] + nums[k] > cur_target)
                k--;
            else
                break;                   
        }
        if (diff == 0)
            break;
        while (nums[i + 1] == nums[i] && i < nums.size() - 2)
            i++;
    }
    return result;
}
// 2Sum Closest
int twoSumClosest(vector<int>& nums, int target) {
    sort(nums.begin(), nums.end());
    int diff = INT_MAX, res;
    int i = 0, j = nums.size() - 1;
    while (i < j) {
        int sum = nums[i] + nums[j];
        if (abs(sum - target) < diff) {
            res = sum;
            diff = abs(sum - target);
        }
        if (sum < target)
            i++;
        else if (sum > target)
            j--;
        else
            break;
    }
    return res;
}
// Rotate Image (LeetCode)
// 首先沿對角線翻轉(zhuǎn)一次,然后沿水平中線翻轉(zhuǎn)一次
void rotate(vector<vector<int>>& matrix) {
    int n = matrix.size();
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - i - 1; j++)
            swap(matrix[i][j], matrix[n - 1 - j][n - 1 - i]);
    for(int i = 0; i < n / 2; i++)
        for (int j = 0; j < n; j++)
            swap(matrix[i][j], matrix[n - 1 - i][j]);
}
// Sliding Window Maximum (LeetCode)
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
    if (nums.empty())
        return vector<int>();
    vector<int> result(nums.size() - k + 1);
    priority_queue<pair<int, int>> maxpq;
    for (int i = 0; i < k - 1; i++)
        maxpq.push(make_pair(nums[i], i));
    for (int i = 0; i < result.size(); i++) {
        maxpq.push(make_pair(nums[i + k - 1], i + k - 1));
        while (maxpq.top().second < i) {
            maxpq.pop();
        }
        result[i] = maxpq.top().first;
    }
    return result;
}
// Linked List Cycle II
ListNode *detectCycle(ListNode *head) {
    ListNode *p = head, *q = head;
    while (q && q->next) {
        p = p->next;
        q = q->next->next;
        if (p == q) {
            q = head;
            while (p != q) {
                p = p->next;
                q = q->next;
            }
            return p;
        }
    }
    return NULL;
}
// Round Robin - Average Waiting Time
double roundRobin(vector<int> arriveTime, vector<int> executionTime, int q) {
    queue<pair<int, int> > requests;
    int i = 0, curTime;
    double totalWaitingTime = 0;
    while (i < arriveTime.size() || !requests.empty()) {
        if (!requests.empty()) {
            int arrTime = requests.front().first;
            int exeTime = requests.front().second;
            requests.pop();
            totalWaitingTime += (curTime - arrTime);
            curTime += min(exeTime, q);
            while (i < arriveTime.size() && arriveTime[i] < curTime) {
                requests.push(make_pair(arriveTime[i], executionTime[i]));
                i++;
            }
            if (exeTime > q)
                requests.push(make_pair(curTime, exeTime - q));
        } else {
            requests.push(make_pair(arriveTime[i], executionTime[i]));
            curTime = arriveTime[i];
            i++;
        }
    }
    return totalWaitingTime / arriveTime.size();
}
// Shortest Job First - Average Waiting Time
struct Task {
    int arrTime;
    int exeTime;
    Task(int a, int e) : arrTime(a), exeTime(e) {}
    bool operator<(const Task &other) const {
        if (exeTime == other.exeTime)
            return arrTime > other.arrTime;
        return exeTime > other.exeTime;
    }
};
double shortestJobFirst(vector<int> arriveTime, vector<int> executionTime) {
    priority_queue<Task> pq;
    for (int i = 0; i < arriveTime.size(); i++)
        pq.push(Task(arriveTime[i], executionTime[i]));
    double totalWaitingTime = 0;
    int curTime = pq.top().arrTime;
    while (!pq.empty()) {
        int arrTime = pq.top().arrTime;
        int exeTime = pq.top().exeTime;
        pq.pop();
        if (curTime < arrTime)
            curTime = arrTime;
        else
            totalWaitingTime += (curTime - arrTime);
        curTime += exeTime;
    }

    return totalWaitingTime / arriveTime.size();
}
// Arithmetic Sequence
// Count of AP (Arithmetic Progression) Subsequences in an array
// 求長度至少為3的等差數(shù)列的個數(shù)

// Minimum Spanning Tree
// Kruskal's algorithm
// implemented with disjoint-set data structure
// KRUSKAL(G):
// 1 A = ?
// 2 foreach v ∈ G.V:
// 3    MAKE-SET(v)
// 4 foreach (u, v) in G.E ordered by weight(u, v), increasing:
// 5    if FIND-SET(u) ≠ FIND-SET(v):
// 6       A = A ∪ {(u, v)}
// 7       UNION(u, v)
// 8 return A
vector<int> parent(n, -1);
int find(vector<int>& parent, int i) {
    if (parent[i] == -1)
        return i;
    return find(parent, parent[i]);
}
void Union(vector<int>& parent, int i, int j, int& circles) {
    // can't use the function name union(), union is a c++ keyword
    int x = find(parent, i);
    int y = find(parent, j);
    if (x != y) {
        parent[x] = y;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娄涩,一起剝皮案震驚了整個濱河市窗怒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蓄拣,老刑警劉巖扬虚,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異球恤,居然都是意外死亡辜昵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門咽斧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堪置,“玉大人躬存,你說我怎么就攤上這事∫ㄏ牵” “怎么了岭洲?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雁竞。 經(jīng)常有香客問我钦椭,道長,這世上最難降的妖魔是什么碑诉? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任彪腔,我火速辦了婚禮,結(jié)果婚禮上进栽,老公的妹妹穿的比我還像新娘德挣。我一直安慰自己,他們只是感情好快毛,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布冒签。 她就那樣靜靜地躺著窟赏,像睡著了一般囱晴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贴铜,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天绍坝,我揣著相機與錄音苔悦,去河邊找鬼。 笑死把介,一個胖子當著我的面吹牛蟋座,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜈七,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼飒硅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庵芭?” 一聲冷哼從身側(cè)響起雀监,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤好乐,失蹤者是張志新(化名)和其女友劉穎瓦宜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體反璃,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡淮蜈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年梧田,在試婚紗的時候發(fā)現(xiàn)自己被綠了悼尾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡未状,死狀恐怖司草,靈堂內(nèi)的尸體忽然破棺而出泡仗,到底是詐尸還是另有隱情,我是刑警寧澤搔课,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布爬泥,位于F島的核電站,受9級特大地震影響袍啡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔗牡,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一辩越、第九天 我趴在偏房一處隱蔽的房頂上張望窗悯。 院中可真熱鬧,春花似錦亏钩、人聲如沸欺旧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽留拾。三九已至鲫尊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咳蔚,已是汗流浹背搔驼。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糯耍,地道東北人。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓啦租,卻偏偏與公主長得像荒揣,于是被迫代替她去往敵國和親系任。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗俩滥。 張土汪:刷leetcod...
    土汪閱讀 12,749評論 0 33
  • ``` /* * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject ...
    非專業(yè)碼農(nóng)閱讀 337評論 0 0
  • JAVA面試題 1霜旧、作用域public,private,protected,以及不寫時的區(qū)別答:區(qū)別如下:作用域 ...
    JA尐白閱讀 1,160評論 1 0
  • 那種“只要努力挂据,就能獲得相當成果的世界”在這個世上根本就不存在崎逃。 每天清晨起來,看到窗外陽光个绍,總會想又一個夜晚就這...
    凌雪懿閱讀 534評論 0 3
  • -()'
    古木參天1971閱讀 175評論 0 0