心得 面試題分析與整理5

2021-07-23 10:40:07 字數 2033 閱讀 9204

17.已知乙個亂序整數陣列

求該陣列排序相鄰兩數的最大間隔

要求時間複雜度為o(n)

時間複雜度的要求基本把先排序的方法濾掉了。

思路如下;

先遍歷一遍找出最大,最小,設定gap=(max-min)/n,設立k個桶,記錄每個桶中最大最小值,然後順序比較各個桶的最大最小。

這裡把遍歷一遍找最大最小示範一下,這個最大最小問題是程式設計之美上的原題。

#include using namespace std;

struct mm

;struct mm getmaxmin(int

*arr, int b, int e);

int main()

; struct mm m = getmaxmin(arr,0,5);

cout<<"\t"

struct mm getmaxmin(int

*arr, int b,int e)

else

return m;

}struct mm ml,mr;

ml = getmaxmin(arr, b, b+(e-b)/2);

mr = getmaxmin(arr, b+(e-b)/2+1,e);

if(ml.max>mr.max)

m.max = ml.max;

else

m.max = mr.max;

if(ml.min

min)

m.min = ml.min;

else

m.min = mr.min;

return m;

}

顯然這是標準的遞迴做法

也利用了分治的思想

18.求兩個相同大小已排序陣列的中位數

找出兩個等長陣列的中位數,演算法複雜度o(lgn)

一看到logn這種條件反射就是要做二分分治和遞迴的.

思路 若m1=m2,則m1為2n個數的中位數,

若m1!=m2,注意到已排序的特性,則中位數字於較大陣列的下半部和另一陣列的上半部

#include 

using namespace std;

int findmean(int

*a, int

m, int

*b,int n);

int getmean(int

*a, int n);

int main()

; int b=;

cout<10,b, 10)int findmean(int

*a,int

m, int

*b, int n)

int getmean(int

*a, int n)

19.陣列合併

這是歸併演算法的核心模組

面試金典255頁原題

思路是從末尾開始合併比較方便。

/**

* created by tangchen on 2016/10/6.

*/public

class

mergearray else

indexmerged--;

}while(indexb>=0)

}}

20.全排序演算法

也稱permutation

或者叫冪集替換

面試金典229頁原題

#include 

#include

using

namespace

std;

void getperm(char *s, int i, int n);

void myswap(char *a, char *b);

int main()

void getperm(char *s, int i, int n)

for(int j=i;j<=n;j++)

}void myswap(char *a, char *b)

心得 面試題分析與整理2

繼續 5.單鏈表反轉,字串反轉 typedef struct node nodelink struct node void reversesiglelink nodelink head 字串反轉比這個要簡單一些,原因是字串可以直接按位置進行索引。include void myswap char ch...

面試題整理

2014.3.19日整理 1.建立一張表hack 裡面就乙個欄位num,然後用sql語句從1開始插入到100,怎麼寫?oracle 答 1.create tablehack num number 建表語句 2.begin for i in1.100loop insert intohack num v...

整理面試題

整理面試題 1 說說activity,intent,service是什麼關係 答 乙個activity 通常是乙個單獨的螢幕,每乙個 activity 都被實現為乙個單獨的類,這些類都是從 activity 基類中繼承而來的。activity 類會顯示由檢視控制項組成的使用者介面,並對檢視控制項的事...