【2018年最新】iOS面試題之演算法

#####1、不用中間變數,用兩種方法交換A和B的值

```

// 1.中間變數

void swap(int a, int b) {

int temp = a;

a = b;

b = temp;

}

// 2.加法

void swap(int a, int b) {

a = a + b;

b = a - b;

a = a - b;

}

// 3.異或(相同為0,不同為1. 可以理解為不進位加法)

void swap(int a, int b) {

a = a ^ b;

b = a ^ b;

a = a ^ b;

}

```

#####2、求最大公約數

```

/** 1.直接遍曆法 */

int maxCommonDivisor(int a, int b) {

int max = 0;

for (int i = 1; i <=b; i++) {

if (a % i == 0 && b % i == 0) {

max = i;

}

}

return max;

}

/** 2.輾轉相除法 */

int maxCommonDivisor(int a, int b) {

int r;

while(a % b > 0) {

r = a % b;

a = b;

b = r;

}

return b;

}

// 擴展:最小公倍數 = (a * b)/最大公約數

```

#####3、模擬棧操作

* 棧是一種數據結構,特點:先進後出

* 練習:使用全局變數模擬棧的操作

###### #include <stdio.h>

###### #include <stdbool.h>

###### #include <assert.h>

//保護全局變數:在全局變數前加static後,這個全局變數就只能在本文件中使用

static int data[1024];//棧最多能保存1024個數據

static int count = 0;//目前已經放了多少個數(相當於棧頂位置)

```

//數據入棧 push

void push(int x){

assert(!full());//防止數組越界

data[count++] = x;

}

//數據出棧 pop

int pop(){

assert(!empty());

return data[--count];

}

//查看棧頂元素 top

int top(){

assert(!empty());

return data[count-1];

}

//查詢棧滿 full

bool full() {

if(count >= 1024) {

return 1;

}

return 0;

}

//查詢棧空 empty

bool empty() {

if(count <= 0) {

return 1;

}

return 0;

}

int main(){

//入棧

for (int i = 1; i <= 10; i++) {

push(i);

}

//出棧

while(!empty()){

printf("%d ", top()); //棧頂元素

pop(); //出棧

}

printf("
");

return 0;

}

```

#####4、排序演算法

選擇排序、冒泡排序、插入排序三種排序演算法可以總結為如下:

都將數組分為已排序部分和未排序部分。

1. 選擇排序將已排序部分定義在左端,然後選擇未排序部分的最小元素和未排序部分的第一個元素交換。

2. 冒泡排序將已排序部分定義在右端,在遍歷未排序部分的過程執行交換,將最大元素交換到最右端。

3. 插入排序將已排序部分定義在左端,將未排序部分元的第一個元素插入到已排序部分合適的位置。

######4.1、選擇排序

* 【選擇排序】:最值出現在起始端

* 第1趟:在n個數中找到最小(大)數與第一個數交換位置

* 第2趟:在剩下n-1個數中找到最小(大)數與第二個數交換位置

* 重複這樣的操作...依次與第三個、第四個...數交換位置

* 第n-1趟,最終可實現數據的升序(降序)排列。

```

void selectSort(int *arr, int length) {

for (int i = 0; i < length - 1; i++) { //趟數

for (int j = i + 1; j < length; j++) { //比較次數

if (arr[i] > arr[j]) {

int temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

}

}

}

}

```

######4.2、冒泡排序

* 【冒泡排序】:相鄰元素兩兩比較,比較完一趟,最值出現在末尾

* 第1趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放後)逐個推進,最值最後出現在第n個元素位置

* 第2趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放後)逐個推進,最值最後出現在第n-1個元素位置

* …… ……

* 第n-1趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放後)逐個推進,最值最後出現在第2個元素位置

```

void bublleSort(int *arr, int length) {

for(int i = 0; i < length - 1; i++) { //趟數

for(int j = 0; j < length - i - 1; j++) { //比較次數

if(arr[j] > arr[j+1]) {

int temp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = temp;

}

}

}

}

```

#####5、折半查找(二分查找)

* 折半查找:優化查找時間(不用遍歷全部數據)

* 折半查找的原理:

* 1> 數組必須是有序的

* 2> 必須已知min和max(知道範圍)

* 3> 動態計算mid的值,取出mid對應的值進行比較

* 4> 如果mid對應的值大於要查找的值,那麼max要變小為mid-1

* 5> 如果mid對應的值小於要查找的值,那麼min要變大為mid+1

// 已知一個有序數組, 和一個key, 要求從數組中找到key對應的索引位置

```

int findKey(int *arr, int length, int key) {

int min = 0, max = length - 1, mid;

while (min <= max) {

mid = (min + max) / 2; //計算中間值

if (key > arr[mid]) {

min = mid + 1;

} else if (key < arr[mid]) {

max = mid - 1;

} else {

return mid;

}

}

return -1;

}

```

------------------

qq技術交流群

![qq交流群.jpeg](upload-images.jianshu.io)

作者微信公眾號

![微信公眾號.jpg](upload-images.jianshu.io)


推薦閱讀:

TAG:iOS開發 | iOS應用推薦 | 技術面 |