面試中遇到的這些算法,在平常工作中糠赦,基本不會用到会傲。
不過現(xiàn)實的面試中經(jīng)常喜歡問關(guān)于算法的問題
有些還要求寫出代碼锅棕。一般來說,用c語言表達比較好淌山。因為這是算法啊哲戚,過程式編程,當(dāng)然是c語言比較合適艾岂。
在
XCode
中,Object-C
和C
可以混編朋其,這個也算是蠻方便的Object-C
推薦的命名方式是“小駝峰”王浴,而C
的經(jīng)典應(yīng)用場景是Linux
,這里推薦的命名方式是小寫字母加下劃線連接這里的Demo梅猿,將
Object-C
和C
直接混編了氓辣。不過,在實際應(yīng)用中袱蚓,如果避不開C钞啸,那么還是將兩者分開比較好。然后提供一個混編的接口層喇潘,進行隔離体斩。不然,兩種編程風(fēng)格混合颖低,對于代碼的閱讀和維護始終不是好事情絮吵。
快速排序
這是目前所知道的效率最高的排序算法,也是題解起來最抽象的一種排序算法忱屑,需要重點掌握蹬敲。
挖坑填數(shù)+分治法下面這篇文章總結(jié)的很到位
白話經(jīng)典算法系列之六 快速排序 快速搞定主要過程是:(s是數(shù)組,l是左邊界莺戒,一般是0伴嗡;r是右邊界,數(shù)組長度-1)
(1)將數(shù)組最左邊的數(shù)s[l]取出來从铲,暫存在一個臨時變量x中
(2)i =l; j = r; 將基準數(shù)挖出形成第一個坑s[i]瘪校。==== 挖坑
(3)j--由后向前找比它小的數(shù),找到后挖出此數(shù)填前一個坑s[i]中
(4)i++由前向后找比它大的數(shù)食店,找到后也挖出此數(shù)填到前一個坑s[j]中渣淤。
(5)重復(fù)執(zhí)行2,3二步吉嫩,直到i==j价认,將基準數(shù),暫存在臨時變量x中自娩,填入s[i]中用踩。
(6)一遍走完了渠退,然后左邊來一下(l = l; r = i - 1); 右邊來一下(l = i + 1; r = r)=== 遞歸法,或者叫分治法
(7)退出條件是l >= r;(只有一個元素了)參考代碼:
//快速排序
void quick_sort(int s[], int l, int r) {
if (l < r) {
//Swap(s[l], s[(l + r) / 2]); //將中間的這個數(shù)和第一個數(shù)交換 參見注1
int i = l, j = r, x = s[l];
while (i < j) {
while(i < j && s[j] >= x) {// 從右向左找第一個小于x的數(shù)
j--;
}
if(i < j) {
s[i] = s[j];
}
while(i < j && s[i] < x) {// 從左向右找第一個大于等于x的數(shù)
i++;
}
if(i < j) {
s[j] = s[i];
}
}
s[i] = x;
quick_sort(s, l, i - 1); // 遞歸調(diào)用
quick_sort(s, i + 1, r);
}
}
冒泡排序
這是本人最喜歡的排序算法脐彩,因為簡單
基本思想是找出最小的一個碎乃,放好;然后往前走一步惠奸,在剩下的里面找出最小的一個梅誓,放好;再往前走一步佛南;===一直走到最后一步梗掰;
實現(xiàn)也簡單,i嗅回,j兩層循環(huán)嵌套就可以了及穗。
void bubble_sort(int s[], int length) {
for (int i = 0; i < length; i++) {
for (int j = i; j < length; j++) {
if (s[i] > s[j]) {
int temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
}
網(wǎng)上也有很好的參考文章。
經(jīng)典排序算法 - 冒泡排序Bubble sort
求最大公約數(shù)
采用輾轉(zhuǎn)相除法最簡單绵载。下面這篇文章寫得很清楚
常見算法:C語言求最小公倍數(shù)和最大公約數(shù)三種算法
int gcd(int a, int b) {
int temp = 0;
if (a < b) {
temp = a;
a = b;
b = temp;
}
while (b != 0) {
temp = a % b;
a = b;
b = temp;
}
return a;
}
階乘
這個實現(xiàn)很簡單埂陆,就是遞歸的基本原理。還有著名的裴波那切數(shù)列娃豹,都是這一類問題焚虱。
(1)退出條件:參數(shù)為0或者1的時候,返回1
(2)遞歸:n * f(n-1)
如果要做好一點培愁,就是判斷一下參數(shù)著摔,不要太大,否則程序會傻掉的(數(shù)值越界)
int factorial(int n) {
if (n > 100) {
return -1; // 太大了定续,算不出來谍咆,會越界
}
if (n == 1 || n ==0 ) {
return 1;
}
return n * factorial(n - 1);
}
二分查找
先要將數(shù)組從小到大排好隊
比較中間那個,找到就返回
根據(jù)比較結(jié)果私股,在左邊找摹察,或者在右邊找
效率比遍歷要高一些
返回的是數(shù)組下標
如果有重復(fù)的,找到一個就返回了倡鲸,不一定是哪一個
int binary_search(int* a, int len, int goal) {
int low = 0;
int high = len - 1;
while (low <= high) {
int middle = (high - low) / 2 + low; // 直接使用(high + low) / 2 可能導(dǎo)致溢出
if (a[middle] == goal) {
return middle;
}
//在左半邊
else if (a[middle] > goal) {
high = middle - 1;
}
//在右半邊
else {
low = middle + 1;
}
}
//沒找到
return -1;
}
判斷質(zhì)數(shù)
這里只用最簡單直接打判斷供嚎,一個個除,看余數(shù)
int isPrime(int n) {
for(int i = 2; i <= sqrt(n); i++) {
if(n % i == 0) {
return 0;
}
}
return 1;
}
更高效的算法峭状,有相關(guān)的文章可以參考
判斷一個數(shù)是否為質(zhì)數(shù)/素數(shù)——從普通判斷算法到高效判斷算法思路
字符串逆序輸出
直接用指針進行操作
void reverse(char s[]) {
// p指向字符串頭部
char *p = s ;
// q指向字符串尾部
char *q = s ;
while('\0' != *q) {
q++ ;
}
q-- ;
// 交換并移動指針克滴,直到p和q交叉
while(q > p) {
char t = *p;
char m = *q;
*p = m;
*q = t;
p++;
q--;
}
}