iOS面試的算法相關

轉自: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 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

相關文章
相關標籤/搜索