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 類會顯示由檢視控制項組成的使用者介面,並對檢視控制項的事...