個人秋招流程3-常見面試題

其他代碼:

  1. 螺旋打印,傾斜打印數組
  1. 矩陣乘法
  2. O(1)空間判斷整數是否爲迴文數字 (負數;直接翻轉會溢出) => 思路具體如何取? 取最高位,最低位後; 在刪除最高位最低位
  3. 矩形中1的個數(連通集 & 正方形分別如何做?)
  4. 打印所有的子集
  5. 買賣股票 1次?dp[i]當前位置的最小值 dp[i] = dp[i-1] or prices[i]
  6. 買賣股票 多次?當前爲止的最大利潤 dp[i] = dp[i-1]+prices[i]-prices[i-1] or dp[i-1]
  7. 買賣股票 dp[k, i] = max(dp[k, i-1], prices[i] - prices[j] + dp[k-1, j-1]), j=[0…i-1]
    第K手交易的= 不做交易的前一天的收益; 在[0,i-1]天中的某一個收益上增加一手交易
  1. 最長公共子序列 dp[i][j] = std::max(dp[i-1][j], dp[i][j-1])
  2. 最長上升子序列 兩個for循環,dp[i]=max{1,dp[j]+1},遍歷j<i情況
  3. 大數乘法???
  4. 最長不重複的連續子串 (slow,fast之間是不重複的區間 + fast:遇到之前出現過的字符,則移動slow到此字符出現的位置 思考:如何實現的?開闢256大小的空間存儲value-index對)
  1. 位運算: 只出現1次,其他出現2次 (數組內逐元素異或)
  2. 位運算: 兩個數字出現1次,其他出現兩次 (1.尋找逐元素異或,尋找爲1的index 2.劃分數組後轉化爲問題12)
  3. 位運算: 只出現1次,其它出現3次 (二進制每一位統計1的個數 % 3, 餘數即爲所求)
  4. 位運算: 只出現2次,其他出現1次 ?(1~100的數字,有一個出現2次。 異或1~100自己異或 ^ 包含101個數字的數組異或 || 1.hash表 || 2.sum求和 )
  5. 位運算: 不使用加減法做加法? 劍指offer 47
  6. 位運算: 數字中1的個數 思路: 1.考慮正負數 2.最優解法:
  1. while(K){ //每次把K的最右側第一個1置位0
    ++count;
    K = K & (K-1);
    }

  2. 二叉樹判斷問題:

  1. 對稱樹 輔助函數,helper(left->left,right->right) && helper(left->right,right->left);
  2. 平衡二叉樹 1.輔助函數計算樹深 2.或者類似後續遍歷的遞歸寫法 left遞歸,right遞歸,判斷left-right的差值,return max(left,right)+1
  3. 子樹 1.helper先判斷兩個樹是否相同 2.原函數遞歸判斷A->left,B || A->right,B
  1. 二叉樹的創建問題:
  1. 鏡像樹
  2. 前序遍歷帶# 類似於前序遍歷的流程,TreeNode* build(vector&arr,int& index)
  3. 前序&中序
  1. 二叉樹的路徑問題:
  1. 最大深度 4行
  2. 最大直徑 類似後續遍歷,root節點處理左右子樹和
  3. 路徑和 pathSum(TreeNode* root, int target, vector&path,vector<vector>& ans)
  4. 最近公共父節點
  1. 二叉搜索樹問題:
  1. 二叉搜索樹的最近公共父節點 參數: TreeNode* root,p,q
  2. 第K小的值
  3. 每一個節點的val修改爲所有大於其的和
  1. 兩個數組交集(有序:歸併排序 無序:hashmap,另一個數組做查找)

  2. 二分查找(
    1.開平方while(|mid^2-target|>ξ)
    2.有序數組第一個等於K的值,最後一個等於K的值 等於K的判斷條件放在while(low<=high)最後
    3.有序數組第一個大於等於K的值
    4.旋轉數組尋找旋轉點,尋找K值
    5.二分法: 牛頓迭代法:while(xn^2-num>ξ) {xn+1 = xn - f(xn)/f’(xn)} 其中:f(xn)=x^2-2
    6.牛頓法 ==> f(xn+1) = f(xn) + f’(xn)*(xn+1 - xn) = 0

  3. 滿二叉樹(節點是滿的),完全二叉樹(最後一層空缺,只能空缺在右邊)==>完全二叉樹的最後一個節點

  4. 二叉樹中序遍歷的下一個節點(有指向父節點的指針); 二叉樹的葉子節點的公共父節點

  5. 後綴數組 字符串中子串出現最多的次數 ???

  6. 尋找明星的策略(羣衆之間的關係未知,智力題 去看BAT100題)

  7. 圖的最短路徑算法
    1)Floyd算法
    鄰接矩陣=i,j的最短距離
    第一重for循環遍歷中間節點K∈(0,N); 兩重循環更新edge[i][j]>如果可達,更新Edge[i][j]=min(self,edge[i][k]+edge[k][j])
    2)Dijkstra算法
    加權無向圖
    單源最短路徑,鄰接鏈表
    mark[] 表示節點是否存在於s的最短路徑集合中; mark
    true,dist[]是最短路徑。 否則 distp[i]表示s經過集合某個元素K再到達i的距離
    1.遍歷n-1個頂點 2.空集加入start節點 3.從所有不在集合中的節點,選擇dist[]最短距離的newP
    2.S可達的最短路徑集合中新加入的newP,更新其newP的鄰接鏈表 可達點的dist[];
    3)Bellman-Ford
    加權(可負)有向圖
    任意順序放鬆有向圖的所有邊,重複V(頂點個數)輪
    4)拓撲排序
    無權重的有向圖,不斷刪除入度爲0的頂點。節點沒刪除完但是找不到入度爲0時,存在環路

  8. 劃分物品使得重量最相近(揹包問題)

  9. 數據流的中位數 (最大堆 最小堆的堆頂保存中位數或者中位數兩側值)

  10. 二叉樹: 路徑和&路徑II pathSum(root,sum,path,ans) 注意加入ans的判斷位置;

  11. 二叉樹: 兩個節點的最遠距離 == 樹的直徑 helper(TreeNode* root, int& diameter) diameter = std::max(diameter, ld+rd)

  12. 長度L的繩子最多覆蓋座標軸上多少點? fast,slow指針 (fast-slow<=L max_count,fast++;)否則slow++

  13. 字符串中最長的數字字符串 (DP? dp[i]=dp[i-1]+1 / 0)

  14. 堆排序的流程

  15. 數組旋轉(先旋轉給定點前K個元素 + 在旋轉後面n-k個 + 再做整體旋轉)

  16. 旋轉的數組二分查找給定target

  17. 數組和等於目標值 hashmap

  1. int整數交換一次,使得數字儘可能最大(思路: 尋找遞減區間的分界線 + 從分界線的右側尋找"max" +分界線左邊尋找小於"max"的最大值+ 交換)

///// BFS DFS
34. 小島數量? (DFSHelper何時跳出循環? 傳入哪些參數?) DFSMarking(vector<vector>& grid, int i, int j)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章