iOS面试题系列之常见算法

原文链接点击查看

iOS面试中熟悉常见算法

1、 对以下一组数据进行降序排序(冒泡排序)。“24,17,85,13,9,54,76,45,5,63”

 

int main(int argc, char *argv[]) {
	int array[10] = {24, 17, 85, 13, 9, 54, 76, 45, 5, 63};
	int num = sizeof(array)/sizeof(int);
	for(int i = 0; i < num-1; i++) {
		for(int j = 0; j < num - 1 - i; j++) {
			if(array[j] < array[j+1]) {
				int tmp = array[j];
				array[j] = array[j+1]	
				array[j+1] = tmp;	
			}		
		}	
	}
	for(int i = 0; i < num; i++) {
		printf("%d", array[i]);	
		if(i == num-1) {	
			printf("\n");		
		}	
		else {	
			printf(" ");		
		}	
	}
}


2、 对以下一组数据进行升序排序(选择排序)。“86, 37, 56, 29, 92, 73, 15, 63, 30, 8”

 

 

void sort(int a[],int n)
{
    int i, j, index;
    for(i = 0; i < n - 1; i++) {
        index = i;
        for(j = i + 1; j < n; j++) {
            if(a[index] > a[j]) {
                index = j;
            }
        }
        if(index != i) {
            int temp = a[i];
            a[i] = a[index];
            a[index] = temp;
        }
    }
}
int main(int argc, const char * argv[]) {
    int numArr[10] = {86, 37, 56, 29, 92, 73, 15, 63, 30, 8};
    sort(numArr, 10);
    for (int i = 0; i < 10; i++) {
        printf("%d, ", numArr[i]); 
    }
    printf("\n");
    return 0;
}


3、 快速排序算法

 

 

void sort(int *a, int left, int right) {
    if(left >= right) {
        return ;
    }
    int i = left;
    int j = right;
    int key = a[left];
    while (i < j) {
        while (i < j && key >= a[j]) {
            j--;
        }
        a[i] = a[j];
        while (i < j && key <= a[i]) {
            i++;
        }
        a[j] = a[i];
    }
    a[i] = key;
    sort(a, left, i-1);
    sort(a, i+1, right);
}


4、 归并排序

 

 

void merge(int sourceArr[], int tempArr[], int startIndex, int midIndex, int endIndex) {
    int i = startIndex;
    int j = midIndex + 1;
    int k = startIndex;
    while (i != midIndex + 1 && j != endIndex + 1) {
        if (sourceArr[i] >= sourceArr[j]) {
            tempArr[k++] = sourceArr[j++];
        } else {
            tempArr[k++] = sourceArr[i++];
        }
    }
    while (i != midIndex + 1) {
        tempArr[k++] = sourceArr[i++];
    }
    while (j != endIndex + 1) {
        tempArr[k++] = sourceArr[j++];
    }
    for (i = startIndex; i <= endIndex; i++) {
        sourceArr[i] = tempArr[i];
    }
}

void sort(int souceArr[], int tempArr[], int startIndex, int endIndex) {
    int midIndex;
    if (startIndex < endIndex) {
        midIndex = (startIndex + endIndex) / 2;
        sort(souceArr, tempArr, startIndex, midIndex);
        sort(souceArr, tempArr, midIndex + 1, endIndex);
        merge(souceArr, tempArr, startIndex, midIndex, endIndex);
    }
}

int main(int argc, const char * argv[]) {
    int numArr[10] = {86, 37, 56, 29, 92, 73, 15, 63, 30, 8};
    int tempArr[10];
    sort(numArr, tempArr, 0, 9);
    for (int i = 0; i < 10; i++) {
        printf("%d, ", numArr[i]);
    }
    printf("\n");
    return 0;
}

 

5、 实现二分查找算法(编程语言不限)

 

int bsearchWithoutRecursion(int array[],int low,int high,int target) {
    while(low <= high) {
        int mid = (low + high) / 2;
        if(array[mid] > target)
            high = mid - 1;
        else if(array[mid] < target)
            low = mid + 1;
        else	//findthetarget
            return mid;
    }
    //the array does not contain the target
    return -1;
}

/*----------------------------------------*/

//递归实现
int binary_search(const int arr[],int low,int high,int key)
{
    int mid=low + (high - low) / 2;
    if(low > high)
        return -1;
    else{
        if(arr[mid] == key)
            return mid;
        else if(arr[mid] > key)
            return binary_search(arr, low, mid-1, key);
        else
            return binary_search(arr, mid+1, high, key);
    }
}

6、 如何实现链表翻转(链表逆序)?

 

思路:每次把第二个元素提到最前面来。

 

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

typedef struct NODE {
    struct NODE *next;
    int num;
}node;

node *createLinkList(int length) {
    if (length <= 0) {
        return NULL;
    }
    node *head,*p,*q;
    int number = 1;
    head = (node *)malloc(sizeof(node));
    head->num = 1;
    head->next = head;
    p = q = head;
    while (++number <= length) {
        p = (node *)malloc(sizeof(node));
        p->num = number;
        p->next = NULL;
        q->next = p;
        q = p;
    }
    return head;
}

void printLinkList(node *head) {
    if (head == NULL) {
        return;
    }
    node *p = head;
    while (p) {
        printf("%d ", p->num);
        p = p -> next;
    }
    printf("\n");
}

node *reverseFunc1(node *head) {
    if (head == NULL) {
        return head;
    }
    node *p,*q;
    p = head;
    q = NULL;
    while (p) {
        node *pNext = p -> next;
        p -> next = q;
        q = p;
        p = pNext;
    }
    return q;
}

int main(int argc, const char * argv[]) {
    node *head = createLinkList(7);
    if (head) {
        printLinkList(head);
        node *reHead = reverseFunc1(head);
        printLinkList(reHead);
        free(reHead);
    }
    free(head);
    return 0;
}

 

 
7、 实现一个字符串“how are you”的逆序输出(编程语言不限)。如给定字符串为“hello world”,输出结果应当为“world hello”。
int spliterFunc(char *p) {
    char c[100][100];
    int i = 0;
    int j = 0;
    while (*p != '\0') {
        if (*p == ' ') {
            i++;
            j = 0;
        } else {
            c[i][j] = *p;
            j++;
        }
        p++;
    }
    for (int k = i; k >= 0; k--) {
        printf("%s", c[k]);
        if (k > 0) {
            printf(" ");
        } else {
            printf("\n");
        }
    }
    return 0;
}

8、 给定一个字符串,输出本字符串中只出现一次并且最靠前的那个字符的位置?如“abaccddeeef”,字符是b,输出应该是2。

 

char *strOutPut(char *);
int compareDifferentChar(char, char *);

int main(int argc, const char * argv[]) {
    char *inputStr = "abaccddeeef";
    char *outputStr = strOutPut(inputStr);
    printf("%c \n", *outputStr);
    return 0;
}

char *strOutPut(char *s) {
    char str[100];
    char *p = s;
    int index = 0;
    while (*s != '\0') {
        if (compareDifferentChar(*s, p) == 1) {
            str[index] = *s;
            index++;
        }
        s++;
    }
    return &str;
}

int compareDifferentChar(char c, char *s) {
    int i = 0;
    while (*s != '\0' && i<= 1) {
        if (*s == c) {
            i++;
        }
        s++;
    }
    if (i == 1) {
        return 1;
    } else {
        return 0;
    }
}

 

9、 二叉树的先序遍历为FBACDEGH,中序遍历为:ABDCEFGH,请写出这个二叉树的后序遍历结果。

ADECBHGF

  • 先序+中序遍历还原二叉树:先序遍历是:ABDEGCFH 中序遍历是:DBGEACHF

首先从先序得到第一个为A,就是二叉树的根,回到中序,可以将其分为三部分:

左子树的中序序列DBGE,根A,右子树的中序序列CHF

接着将左子树的序列回到先序可以得到B为根,这样回到左子树的中序再次将左子树分割为三部分:

左子树的左子树D,左子树的根B,左子树的右子树GE

同样地,可以得到右子树的根为C

类似地将右子树分割为根C,右子树的右子树HF,注意其左子树为空

如果只有一个就是叶子不用再进行了,刚才的GE和HF再次这样运作,就可以将二叉树还原了。

10、 打印2-100之间的素数。

 

int main(int argc, const char * argv[]) {
    for (int i = 2; i < 100; i++) {
        int r = isPrime(i);
        if (r == 1) {
            printf("%ld ", i);
        }
    }
    return 0;
}

int isPrime(int n)
{
    int i, s;
    for(i = 2; i <= sqrt(n); i++)
        if(n % i == 0)  return 0;
    return 1;
}

 

 
11、 求两个整数的最大公约数。
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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值