Time of Update: 2018-12-05
文章目錄 問題:解答:問題:解答:問題:解答:問題:解答:問題:解答:問題:解答: 在上一篇二叉樹問題匯總(1)中總結了下二叉樹的一些基本問題,主要是針對二叉排序樹。這篇文章主要匯總二叉樹的一些常見的但是難度稍大一點的問題。1、判定二叉樹是否存在和為給定值的路徑問題:給定一個值,判定二叉樹是否存在從根結點到葉結點的路徑,其結點的資料之和為該值。比如二叉樹如下所示,給定的和為27:則二叉樹存在的根結點到葉結點的路徑有:path 1: 5 4
Time of Update: 2018-12-05
1、建立二叉搜尋樹二叉搜尋樹是排序的二叉樹,即左子樹的值都不大於根結點,右子樹的值都比根結點大。插入結點到一顆二叉搜尋樹可以使用遞迴或者非遞迴方法。使用遞迴方法代碼簡單,使用非遞迴則易於理解。二叉搜尋樹BST定義:struct node { int data; struct node* left; struct node* right;};二叉搜尋樹建立結點代碼:struct node* newNode(int data){ struct node* nd =
Time of Update: 2018-12-05
題目:給定一個集合S,試找出3個數a, b, c,使得a+b+c=0。也即從集合中找出所有的和為0的3個數。例如:集合S={-1,0, 1, 2, -1, 4},則滿足條件的3個數有2對:(-1, 0, 1)和(-1, 2, -1)。注意(-1,1,0)與(-1,0,1)算同一個解,所以不用重複考慮。當然該例子集合的解也可以寫成:(0, 1, -1)和(2, -1,
Time of Update: 2018-12-05
By implementing algorithms that are able to learn from the data that they explore, machine learning technologies already outperform traditional analytics by far. (No wonder high-flying companies like Google, LinkedIn, Amazon and Pandora have built
Time of Update: 2018-12-05
題目:(1) 一個整數數列,元素取值可能是0~65535中的任意一個數,相同數值不會重複出現。0是例外,可以反覆出現。 請設計一個演算法,當你從該數列中隨意選取5個數值,判斷這5個數值是否連續相鄰。 注意: - 5個數值允許是亂序的。比如: 8 7 5 0 6 - 0可以通配任意數值。比如:8 7 5 0 6 中的0可以通配成9或者4 - 0可以多次出現。 - 複雜度如果是O(n2)則不得分。 (2) 設計一個演算法,找出二叉樹上任意兩個結點的最近共同父結點。 複雜度如果是O(n2)則不得分。
Time of Update: 2018-12-05
題目:假設有n個數組a[m],(可以看作a[n][m]) a[m]表示一個分成m段的物體的每段的狀態, a[m]的元素值為0或1,0表示這段不可用,1表示可用 則a[m]表示的物體可用的部分等於所有1的和, 為s(a[m])=A 求一個公用解b[m], 假定其和為s(b[m])=B 如果a[m]包含b[m],也就是b[m]是a[m]的子集, 則a[m]中的b[m]部分可以使用, 其和等於b[m]的和,B。 反之如果a[m]不能完全包含b[m],則a[m]都不可用,其和為0
Time of Update: 2018-12-05
題目描述:(minimum swaps)Given a sequence, we have to find the minimum no of swaps required to sort the sequence. 分析:formula: no. of elements out of place - "cycles" in the sequence A cycle is a set of elements, each of which is in the place of
Time of Update: 2018-12-05
題目:如何求入棧順序為1234……N的序列的所有可能的出棧序列? 代碼:遞迴求解 #include <iostream>#include <vector>using namespace std;void print(vector<int>& v){ cout<<endl; for(int i=0;i<(int)v.size();i++) { cout<<v[i]<<"/t";
Time of Update: 2018-12-05
[問題描述] 問題1. 計算正數num1的上臨近數num2,num2滿足: (1) num2 > num1; (2) num1、num2各位元字之和相等(十進位表示); (3) num2是滿足(1)、(2)條件的最小正數 問題2. (另一個相似問題) 計算正數num1的下臨近數num2,num2滿足(注意一個數的下臨近數可能不存在): (1) num2 < num1; (2)
Time of Update: 2018-12-05
計算一個集合的組合,最直觀的方式是使用遞迴:首先選擇一個元素,然後在剩下的集合中選擇其餘元素。代碼實現也很簡單,下面的代碼計算集合的所有可能的組合(一個或多個元素):#include <iostream>#include <vector>#include <iterator>#include <cassert>using namespace std;template <typename ElemType>void
Time of Update: 2018-12-05
1、從N個數裡選最XX的K個這個問題是問得最多的。一般情況下K會遠小於N。這道題有兩個思路,一是參照快速排序的思想,遞迴地劃分,直至找到左邊的K個。快排在最壞的情況下,是會退化為平方的,所以要加上隨機化。即使不隨機化,也有些比較複雜的演算法保證複雜度不會很高,可以參照《演算法導論》裡求第K大的數的演算法。如果答出這個演算法,估計面試官都佩服你。另一個思路,則比較保險,維護一個堆,裡面存K個數,考察下一個數的時候,先讓它跟堆頂元素比較,如果合乎要求,再把堆頂元素出堆,然後把下一個元素放進去。如果面
Time of Update: 2018-12-05
全排列演算法有兩個比較常見的實現:遞迴排列和字典序排列。(1)遞迴實現從集合中依次選出每一個元素,作為排列的第一個元素,然後對剩餘的元素進行全排列,如此遞迴處理,從而得到所有元素的全排列。演算法實現如下:#include <iostream>#include <algorithm>using namespace std;template <typename T>void CalcAllPermutation_R(T perm[], int first,
Time of Update: 2018-12-05
題目描述:設計一FIFO的隊列,要求包含min函數,而且其push_back(),pop_front(),get_min()操作的時間複雜度為O(1),空間複雜度為O(n)。 思路:暫時沒有想出完美的解法,但思路可參見“程式員面試題精選(2):設計包含min函數的棧”http://blog.csdn.net/yysdsyl/archive/2007/10/24/1841644.aspx 的思路來做,用雙棧加雙min棧來類比這樣一個隊列。 代碼:暫無(後續可能補上)
Time of Update: 2018-12-05
可重複的群組合問題是指,在計算(產生)組合時可以允許元素重複的一類組合問題。例如,對於有四個元素的集合{a, b, c, d},其可重複的群組合C(4, 3)有20個:aaa, aab, aac, aad, abb, abc, abd, acc, acd, add, bbb, bbc, bbd, bcc, bcd, bdd, ccc, ccd, cdd, ddd。用P(n, k)表示從n個元素中選出k個元素(允許重複)的組合問題,那麼此問題可以分解為兩個子問題:P(n, k-1)和P(n-1,
Time of Update: 2018-12-05
據說這是一道Google的面試題。在網上看到有些人在討論這道題目,但能給出正確演算法的人並不多。問題描述:有兩個長度均為n的整數數組A和B,現在要從這兩個數組中各抽出s個數字,分別構成兩個新的數組C和D,要求數組C和D的內積最大。即已知:A=[a1,a2,...,an],B=[b1,b2,...,bn];求:C=[c1,c2,...,c5],D=[d1,d2,...,d5];滿足:c1,...,c5屬於A,d1,...,d5屬於B;使得C、D的內積(c1*d1,c2*d2,...,c5*d5)最
Time of Update: 2018-12-05
【問題描述】有一個用矩陣描述的迷宮,矩陣元素取值0或1(0表示可以進入,1表示不能進入)。現在要找到一條從最左上方到最右下角的最短路徑(最左上方和最右下角的矩陣元素均為0)。比如,對於如下4*4矩陣描述的迷宮:0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0,0, 1, 0, 0,0, 0, 0, 0它的最短路徑為8(路徑上所有位置數),移動方向依次為:右、右、右、下、下、下、下。【問題分析】這裡,可以把矩陣各元素及可移動的方向看成一個無向圖,如果可以從一個位置向上、下、左、
Time of Update: 2018-12-05
Kai-Fu Lee trained an army of Chinese engineers at Microsoft and Google. Now they’re turning Beijing into a technology powerhouse.Cities all over the world have tried to duplicate Silicon Valley’s prowess at churning out startups and
Time of Update: 2018-12-05
【問題描述】歌德巴哈猜想說任何一個不小於6的偶數都可以分解為兩個奇素數之和。對此問題擴充,如果一個整數能夠表示成兩個或多個素數之和,則得到一個素數和分解式。對於一個給定的整數,輸出所有這種素數和分解式。注意,對於同構的分解只輸出一次(比如5隻有一個分解2 + 3,而3 + 2是2 + 3的同構分解式)。例如,對於整數8,可以作為如下三種分解:(1) 8 = 2 + 2 + 2 + 2(2) 8 = 2 + 3 + 3(3) 8 = 3 +
Time of Update: 2018-12-05
lib是和dll對應的。 lib是靜態庫檔案,dll是動態庫檔案。 所謂靜態就是link的時候把裡面需要的東西抽取出來安排到你的exe檔案中,以後運行 你的exe的時候不再需要lib。 所謂動態就是exe啟動並執行時候依賴於dll裡面提供的功能,沒有這個dll,你的exe無法運 行。 lib, dll, exe都算是最終的目標檔案,是最終產物。而c/c++屬於原始碼。原始碼和最終
Time of Update: 2018-12-05
【問題描述】(1)對於一個整數n,寫一個函數f(n),使得它返回1到n之間的所有自然數(十進位數表示)中出現的‘1’的次數。例如,對於n=13,自然數1,2,3,4,5,6,7,8,9,10,11,12,13中‘1’出現的次數為6,所以f(13) =