摘要:例如題目解析題目的意思很明顯,就是把兩個數(shù)字加起來,需要考慮進(jìn)位的情況。總結(jié)這個題目如果都能獨(dú)立完成,那么水平已經(jīng)可以足以應(yīng)付國內(nèi)各大企業(yè)的算法面。
歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~
本文由落影發(fā)表前言
LeetCode上的題目是大公司面試常見的算法題,今天的目標(biāo)是拿下5道算法題: 題目1是基于鏈表的大數(shù)加法,既考察基本數(shù)據(jù)結(jié)構(gòu)的了解,又考察在處理加法過程中的邊界處理; 題目2是求數(shù)組出現(xiàn)頻率前k大的數(shù)字,考察思維能力,代碼很短; 題目3是給出從兩個數(shù)組中選擇數(shù)字,組成一個最大的數(shù)字,考察的是貪心的思想; 前三個都偏向于考察想法,實(shí)現(xiàn)的代碼都比較簡單; 題目4、5是數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)題,也是大部分人比較頭疼的題目,因?yàn)樾枰^多的數(shù)據(jù)結(jié)構(gòu)和STL實(shí)現(xiàn),并且還有時間和空間的限制。
正文 1、Add Two Numbers II題目鏈接 題目大意:
給倆個鏈表,節(jié)點(diǎn)由0~9的數(shù)字組成,分別表示兩個數(shù)字; 求出兩個數(shù)字的和,以鏈表的形式返回。
例如 Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 7243 + 564 =7807 Output: 7 -> 8 -> 0 -> 7
題目解析: 題目的意思很明顯,就是把兩個數(shù)字加起來,需要考慮進(jìn)位的情況。 因?yàn)槭菃蜗虻逆湵?,遍歷后很難回溯,所以先把數(shù)字存到vec中。 并且為了處理方便,vec的最低位存在vec的起始部分。 于是從0開始遍歷兩個vec即可,注意考慮最后進(jìn)位的情況。
復(fù)雜度解析: 時間復(fù)雜度是O(N) 空間復(fù)雜度是O(N)
struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *ret = NULL; vector2.Top K Frequent Elementsvec1, vec2; sum(l1, vec1); sum(l2, vec2); int n = vec1.size(), m = vec2.size(), flag = 0; for (int i = 0; i < n || i < m; ++i) { int x = 0, y = 0; if (i < n) { x = vec1[i]; } if (i < m) { y = vec2[i]; } int s = x + y + flag; if (s > 9) { s -= 10; flag = 1; } else { flag = 0; } ListNode *tmp = new ListNode(s); tmp->next = ret; ret = tmp; } if (flag) { ListNode *tmp = new ListNode(1); tmp->next = ret; ret = tmp; } return ret; } void sum(ListNode* list, vector &vec) { if (list->next) { sum(list->next, vec); } vec.push_back(list->val); } };
題目鏈接 題目大意:
給出一個數(shù)組和一個數(shù)字k,返回按數(shù)字出現(xiàn)頻率的前k個的數(shù)字; 1 <= k <= n, n是數(shù)組大??;
example, Given [1,1,1,2,2,3] and k = 2, return [1,2].
題目解析:
題目分為兩個步驟: 1、統(tǒng)計(jì)每個數(shù)字的出現(xiàn)次數(shù); 2、從中選擇k個次數(shù)最多的數(shù)字;
一個簡單的做法: 用哈希表統(tǒng)計(jì)每個數(shù)字的出現(xiàn)次數(shù); 把每個數(shù)字的出現(xiàn)次數(shù)和數(shù)字組成一個pair,放入優(yōu)先隊(duì)列;
這樣從優(yōu)先隊(duì)列中取出k個即可。
復(fù)雜度解析: 時間復(fù)雜度是O(NlogN),主要在最后的優(yōu)先隊(duì)列。
其他解法: 有一個O(NlogK)的優(yōu)化; 首先把隊(duì)列變成最小有限隊(duì)列, 每次pair放入優(yōu)先對時,如果當(dāng)前的size大于k,那么彈出top; 這樣每次的操作從O(logN)變成O(logK)。
class Solution { public: vector3、create-maximum-numbertopKFrequent(vector & nums, int k) { unordered_map numsHash; for (int i = 0; i < nums.size(); ++i) { ++numsHash[nums[i]]; } priority_queue > q; for (int i = 0; i < nums.size(); ++i) { if(numsHash[nums[i]]) { q.push(make_pair(numsHash[nums[i]], nums[i])); numsHash[nums[i]] = 0; } } vector ret; for (int i = 0; i < k; ++i) { ret.push_back(q.top().second); q.pop(); } return ret; } }leetcode;
題目鏈接 題目大意: 給出兩個數(shù)組,數(shù)組只包括0~9十個數(shù)字,長度分別為n、m; 從兩個數(shù)組中選出k個數(shù),組成一個長度為k的數(shù)字,要求: 1、從數(shù)組n、m選擇出來的數(shù)字相對位置不變; 2、最后的數(shù)字最大; 輸出最后的數(shù)字。
Example 1: nums1 = [3, 4, 6, 5] nums2 = [9, 1, 2, 5, 8, 3] k = 5 return [9, 8, 6, 5, 3] Example 2: nums1 = [6, 7] nums2 = [6, 0, 4] k = 5 return [6, 7, 6, 0, 4]
題目解析:
要求最后數(shù)字最大,那么盡可能把數(shù)字大的排在前面; 在都合法的前提下,99 肯定比 98要大; 那么可以按照這樣的貪心策略: 先枚舉t,t表示從數(shù)組nums1中選出t個數(shù)字,那么數(shù)組nums2中應(yīng)該選出k-t個數(shù)字; 兩個數(shù)組的所有數(shù)字組成最大的數(shù)字,因?yàn)閮蓚€數(shù)組間的數(shù)字是可以任意順序,那么只需每次選擇較大的放在前面即可。
問題簡化成,O(N)每次從數(shù)組中選出t個最大的數(shù)字; 這個可以用貪心解決: 假設(shè)數(shù)組當(dāng)前枚舉到第i個,且nums[i]=x; 從左到右遍歷已經(jīng)選擇的數(shù),當(dāng)遇到一個數(shù)字t,t 題目鏈接 題目大意: 實(shí)現(xiàn)一個數(shù)據(jù)結(jié)構(gòu),包括以下三個方法: 1、insert(val): 插入一個數(shù)字; 2、remove(val): 移除一個數(shù)字; 3、getRandom: O(1)隨機(jī)返回一個數(shù)字; 題目解析: 插入和移除數(shù)字不麻煩,考慮如何在O(1)時間返回一個數(shù)字。 容易知道,放在數(shù)組里面可以,然后隨機(jī)返回一個位置可以實(shí)現(xiàn)。 增加可以在數(shù)組最末端增加; 刪除數(shù)組中間某個數(shù)字時,可以把最末端的數(shù)字放到刪除的位置上; 現(xiàn)在的問題是,如何快速找到數(shù)組中該刪除的某個位置; 考慮用hash來實(shí)現(xiàn)。 數(shù)組就是vector 題目鏈接 題目大意: 實(shí)現(xiàn)一個數(shù)據(jù)結(jié)構(gòu),要求: 1、Inc(Key) - Inserts a new key with value 1. Or increments an existing key by 1. Key is guaranteed to be a non-empty string. 2、Dec(Key) - If Key"s value is 1, remove it from the data structure. Otherwise decrements an existing key by 1. If the key does not exist, this function does nothing. Key is guaranteed to be a non-empty string. 3、GetMaxKey() - Returns one of the keys with maximal value. If no element exists, return an empty string "". 4、GetMinKey() - Returns one of the keys with minimal value. If no element exists, return an empty string "". 要求所有的數(shù)據(jù)結(jié)構(gòu)的時間復(fù)雜度是O(1); 題目解析: 在不考慮復(fù)雜度的前提下,樸素做法是遍歷,O(N); 簡單的優(yōu)化,用map來維護(hù)優(yōu)先隊(duì)列,操作1、2先獲取key值,更新完重新插入;操作3、4直接拿隊(duì)列top;每個操作的復(fù)雜度是O(LogN); 題目要求是O(1),那么必然不能使用樹類型的結(jié)構(gòu),應(yīng)該利用題目特性,配合hash以及貪心來實(shí)現(xiàn)。 假設(shè)有一個key-hash表,來存key的對應(yīng)值。 操作1、先看keyHash里面是否有key,有則+1,無則插入; 操作2、先看keyHash里面是否有key,有則-1,無則Nothing; 為了維護(hù)最值,引入鏈表list,里面所有的元素是從小到大;每個元素是一個桶,桶里放著值相同的key; 操作3、直接獲取list頭元素的值; 操作4、直接獲取list尾元素的值; 同時,操作1、2在操作的過程中,需要把當(dāng)前key值從list對應(yīng)的桶里移除,放到上一個或者下一個桶里,或者丟棄。 為了實(shí)現(xiàn)O(1)獲取key所在位置,可以用iter-hash來維護(hù)key所對應(yīng)元素的迭代器。 這5個題目如果都能獨(dú)立完成,那么水平已經(jīng)可以足以應(yīng)付國內(nèi)各大企業(yè)的算法面。 算法重在勤思多練,埋怨公司出算法題是沒用的,多花時間準(zhǔn)備才是正道。 此文已由作者授權(quán)騰訊云+社區(qū)發(fā)布,更多原文請點(diǎn)擊 搜索關(guān)注公眾號「云加社區(qū)」,第一時間獲取技術(shù)干貨,關(guān)注后回復(fù)1024 送你一份技術(shù)課程大禮包!class Solution {
public:
vector
4、 Insert Delete GetRandom O(1) - Duplicates allowed
Example
插入數(shù)字1;
collection.insert(1);
插入數(shù)字1:
collection.insert(1);
插入數(shù)字2
collection.insert(2);
隨機(jī)返回?cái)?shù)字,要求 2/3可能返回1, 1/3可能返回2;
collection.getRandom();
class RandomizedCollection {
public:
/** Initialize your data structure here. */
RandomizedCollection() {
}
/** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */
bool insert(int val) {
bool ret = hashMap.find(val) == hashMap.end();
hashMap[val].push_back(randVec.size());
randVec.push_back(make_pair(val, hashMap[val].size() - 1));
return ret;
}
/** Removes a value from the collection. Returns true if the collection contained the specified element. */
bool remove(int val) {
bool ret = hashMap.find(val) != hashMap.end();
if (ret) {
auto last = randVec.back();
hashMap[last.first][last.second] = hashMap[val].back();
randVec[hashMap[val].back()] = last;
hashMap[val].pop_back();
if (hashMap[val].empty()) {
hashMap.erase(val);
}
randVec.pop_back();
}
return ret;
}
/** Get a random element from the collection. */
int getRandom() {
return randVec[rand() % randVec.size()].first;
}
private:
unordered_map
5、 All O`one Data Structure
struct Bucket {
int value;
unordered_set
總結(jié)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72447.html
摘要:例如題目解析題目的意思很明顯,就是把兩個數(shù)字加起來,需要考慮進(jìn)位的情況??偨Y(jié)這個題目如果都能獨(dú)立完成,那么水平已經(jīng)可以足以應(yīng)付國內(nèi)各大企業(yè)的算法面。 歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~ 本文由落影發(fā)表 前言 LeetCode上的題目是大公司面試常見的算法題,今天的目標(biāo)是拿下5道算法題: 題目1是基于鏈表的大數(shù)加法,既考察基本數(shù)據(jù)結(jié)構(gòu)的了解,又考察在處理加法過程中...
摘要:很多前端同學(xué)在看到數(shù)據(jù)結(jié)構(gòu)和算法后會有一定的抵觸心理,或者嘗試去練習(xí),但是被難倒,從而放棄。本文選擇的數(shù)據(jù)結(jié)構(gòu)和算法的類別均是出現(xiàn)頻率最高,以及應(yīng)用最廣的類別。面試這是非常現(xiàn)實(shí)的一點(diǎn),也是很多前端學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法的原因。 一、導(dǎo)讀 據(jù)我了解,前端程序員有相當(dāng)一部分對數(shù)據(jù)結(jié)構(gòu)和算法的基礎(chǔ)概念都不是很清晰,這直接導(dǎo)致很多人在看到有關(guān)這部分的內(nèi)容就會望而卻步。 實(shí)際上,當(dāng)你了解了數(shù)據(jù)結(jié)構(gòu)和...
摘要:強(qiáng)烈推薦上值得前端學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)與算法項(xiàng)目,包含圖的演示過程與視頻講解。該倉庫包含了多種基于的算法與數(shù)據(jù)結(jié)構(gòu),提供進(jìn)一步閱讀的解釋和鏈接。數(shù)據(jù)結(jié)構(gòu)和算法必知必會的個代碼實(shí)現(xiàn)。 showImg(https://segmentfault.com/img/bVbvpYZ); 前言 算法為王。想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,就算招式練的再花哨,終究成不了高手;只有內(nèi)功深厚者,前端之路才會走得...
閱讀 3022·2021-10-27 14:15
閱讀 3014·2021-09-07 10:18
閱讀 1332·2019-08-30 15:53
閱讀 1584·2019-08-26 18:18
閱讀 3385·2019-08-26 12:15
閱讀 3468·2019-08-26 10:43
閱讀 662·2019-08-23 16:43
閱讀 2218·2019-08-23 15:27