轉自:https://www.jianshu.com/p/c4820b159159面試
面試中遇到的這些算法,在日常工做中,基本不會用到。算法
不過現實的面試中常常喜歡問關於算法的問題編程
有些還要求寫出代碼。通常來講,用c語言表達比較好。由於這是算法啊,過程式編程,固然是c語言比較合適。數組
在XCode中,Object-C和C能夠混編,這個也算是蠻方便的ui
Object-C推薦的命名方式是「小駝峯」,而C的經典應用場景是Linux,這裏推薦的命名方式是小寫字母加下劃線鏈接指針
這裏的Demo,將Object-C和C直接混編了。不過,在實際應用中,若是避不開C,那麼仍是將二者分開比較好。而後提供一個混編的接口層,進行隔離。否則,兩種編程風格混合,對於代碼的閱讀和維護始終不是好事情。code
Demo地址排序
快速排序
這是目前所知道的效率最高的排序算法,也是題解起來最抽象的一種排序算法,須要重點掌握。遞歸
挖坑填數+分治法下面這篇文章總結的很到位
白話經典算法系列之六 快速排序 快速搞定接口
主要過程是:(s是數組,l是左邊界,通常是0;r是右邊界,數組長度-1)
(1)將數組最左邊的數s[l]取出來,暫存在一個臨時變量x中
(2)i =l; j = r; 將基準數挖出造成第一個坑s[i]。==== 挖坑
(3)j--由後向前找比它小的數,找到後挖出此數填前一個坑s[i]中
(4)i++由前向後找比它大的數,找到後也挖出此數填到前一個坑s[j]中。
(5)重複執行2,3二步,直到i==j,將基準數,暫存在臨時變量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]); //將中間的這個數和第一個數交換 參見注1
int i = l, j = r, x = s[l];
while (i < j) {
while(i < j && s[j] >= x) {// 從右向左找第一個小於x的數
j--;
}
if(i < j) {
s[i] = s[j];
}
while(i < j && s[i] < x) {// 從左向右找第一個大於等於x的數 i++; } if(i < j) { s[j] = s[i]; } } s[i] = x; quick_sort(s, l, i - 1); // 遞歸調用 quick_sort(s, i + 1, r); }
}
冒泡排序
這是本人最喜歡的排序算法,由於簡單
基本思想是找出最小的一個,放好;而後往前走一步,在剩下的裏面找出最小的一個,放好;再往前走一步;===一直走到最後一步;
實現也簡單,i,j兩層循環嵌套就能夠了。
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;
}
}
}
}
網上也有很好的參考文章。
經典排序算法 - 冒泡排序Bubble sort
求最大公約數
採用展轉相除法最簡單。下面這篇文章寫得很清楚
常見算法:C語言求最小公倍數和最大公約數三種算法
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;
}
階乘
這個實現很簡單,就是遞歸的基本原理。還有著名的裴波那切數列,都是這一類問題。
(1)退出條件:參數爲0或者1的時候,返回1
(2)遞歸:n * f(n-1)
若是要作好一點,就是判斷一下參數,不要太大,不然程序會傻掉的(數值越界)
int factorial(int n) {
if (n > 100) {
return -1; // 太大了,算不出來,會越界
}
if (n == 1 || n ==0 ) {
return 1;
}
return n * factorial(n - 1);
}
二分查找
先要將數組從小到大排好隊
比較中間那個,找到就返回
根據比較結果,在左邊找,或者在右邊找
效率比遍歷要高一些
返回的是數組下標
若是有重複的,找到一個就返回了,不必定是哪個
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 可能致使溢出
if (a[middle] == goal) {
return middle;
}
//在左半邊
else if (a[middle] > goal) {
high = middle - 1;
}
//在右半邊
else {
low = middle + 1;
}
}
//沒找到
return -1;
}
判斷質數
這裏只用最簡單直接打判斷,一個個除,看餘數
int isPrime(int n) {
for(int i = 2; i <= sqrt(n); i++) {
if(n % i == 0) {
return 0;
}
}
return 1;
}
更高效的算法,有相關的文章能夠參考
判斷一個數是否爲質數/素數——從普通判斷算法到高效判斷算法思路
字符串逆序輸出
直接用指針進行操做
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--; }
}
字符串面試題(一)字符串逆序
參考文章
iOS面試題系列之常見算法
iOS面試中常見的算法題目
史上最全的iOS面試題及答案
iOSInterviewQuestions
做者:老章888
連接:https://www.jianshu.com/p/c4820b159159 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。