转自:https://www.jianshu.com/p/c4820b159159

面试中遇到的这些算法,在平常工作中,基本不会用到。

不过现实的面试中经常喜欢问关于算法的问题

有些还要求写出代码。一般来说,用c语言表达比较好。因为这是算法啊,过程式编程,当然是c语言比较合适。

在XCode中,Object-C和C可以混编,这个也算是蛮方便的

Object-C推荐的命名方式是“小驼峰”,而C的经典应用场景是Linux,这里推荐的命名方式是小写字母加下划线连接

这里的Demo,将Object-C和C直接混编了。不过,在实际应用中,如果避不开C,那么还是将两者分开比较好。然后提供一个混编的接口层,进行隔离。不然,两种编程风格混合,对于代码的阅读和维护始终不是好事情。

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二步,直到ij,将基准数,暂存在临时变量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

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

iOS面试的算法相关的更多相关文章

  1. iOS面试贴士

    iOS面试小贴士 ———————————————回答好下面的足够了------------------------------------- 多线程.特别是NSOperation 和 GCD 的内部原 ...

  2. IOS面试攻略

    IOS面试攻略(1.0) 2013-10-13 20:58:09|  分类: IOS面试 |  标签:ios知识点总汇  ios面试  |举报|字号 订阅     来自:伊甸网 @ 看到这个关键字,我 ...

  3. IOS面试问题总结

    IOS面试问题总结 分类: IOS开发2013-11-20 17:26 10458人阅读 评论(1) 收藏 举报   目录(?)[+]   通过网络搜寻和自己总结经历找了一些IOS面试经常被问道的问题 ...

  4. iOS面试准备之思维导图

    以思维导图的方式对iOS常见的面试题知识点进行梳理复习,文章xmind点这下载,文章图片太大查看不了也点这下载 你可以在公众号 五分钟学算法 获取数据结构与算法相关的内容,准备算法面试 公众号回复 g ...

  5. iOS面试准备之思维导图(转)

    以思维导图的方式对iOS常见的面试题知识点进行梳理复习. 目录 1.UI视图相关面试问题 2.Runtime相关面试问题 3.内存管理相关面试问题 4.Block相关面试问题 5.多线程相关面试问题 ...

  6. 一些iOS面试基础题总结

    一些iOS面试基础题总结 目录 多线程 AutoLayout objc_msgSend Runtime 消息转发 Category NSObject 与 objc_class Runloop Auto ...

  7. iOS 面试基础题目

    转载: iOS 面试基础题目 题目来自博客:面试百度的记录,有些问题我能回答一下,不能回答的或有更好的回答我放个相关链接供参考. 1面 Objective C runtime library:Obje ...

  8. C C++ OC iOS面试重点问题(一)

    C C++ OC iOS面试重点问题(一) 1.字符串常量需要加\0 2.逻辑运算 位操作(经典:实现两个数的交换) 3.关键字 4.引用和指针的区别和联系 5.如何引用一个已经定义过的全局变量?  ...

  9. 十个iOS面试问题

    十个iOS面试问题 十个iOS面试问题.不管对于招聘和应聘来说,面试都是很重要的一个环节,特别对于开发者来说,面试中的技术问题环节不仅是企业对应聘者技能和积累的考察,也是一个开发者自我检验的好机会. ...

随机推荐

  1. Project Euler 58: Spiral primes

    从一开始按以下方式逆时针旋转,可以形成一个边长为七的正方形螺旋: 一个有趣的现象是右下对角线上都有一个奇完全平方数,但是更有趣的是两条对角线上的十三个数中有八个数是素数(已经标红),也就是说素数占比为 ...

  2. 你知道如何优化Join语句吗?

    join语句的两种算法,分别是:NLJ和BNL 测试数据: create table t1(id int primary key, a int, b int, index(a)); create ta ...

  3. secureCRT连接虚拟机

    1.secureCRT英文版下载 链接:https://pan.baidu.com/s/1LFWD-k2r4ZB7DHQA66QogQ 密码:khmo 破解方式参考 2.虚拟机静态IP设置 参考 3. ...

  4. pat 1035 Password(20 分)

    1035 Password(20 分) To prepare for PAT, the judge sometimes has to generate random passwords for the ...

  5. suseoj 1209: 独立任务最优调度问题(动态规划)

    1209: 独立任务最优调度问题 时间限制: 1 Sec  内存限制: 128 MB提交: 3  解决: 2[提交][状态][讨论版][命题人:liyuansong] 题目描述 用2台处理机A和B处理 ...

  6. Django 自定义分页器

    为什么要实现分页? 在大部分网站中分页的功能都是必要的,尤其是在后台管理中分页更是不可或缺 分页能带给用户更好的体验,也能减轻服务器的压力 对于分页来说,有许多方法都可以实现 例如把数据全部读取出来在 ...

  7. C语言|博客作业03

    这个作业属于哪个课程 C程序语言设计 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/8654 我在这个课程的目标是 ...

  8. ACE框架 基于共享内存的分配器 (算法设计)

    继承上一篇<ACE框架 基于共享内存的分配器设计>,本篇分析算法部分的设计. ACE_Malloc_T模板定义了这样一个分配器组件 分配器组件聚合了三个功能组件:同步组件ACE_LOCK, ...

  9. 024.掌握Pod-部署MongoDB

    一 前期准备 1.1 前置条件 集群部署:Kubernetes集群部署参考003--019. glusterfs-Kubernetes部署:参考<附010.Kubernetes永久存储之Glus ...

  10. vim常用插件使用方法整理【持续更】

    nerdtree 和编辑文件一样,通过h j k l移动光标定位切换工作台和目录 ctr+w+h 光标focus左侧树形目录,ctrl+w+l 光标focus右侧文件显示窗口. ctrl+w+w,光标 ...