2020年6月最新iOS口试题总结(答案篇)

源码 2024-9-15 13:06:20 159 0 来自 中国
来自网络,笔记自用
关于口试题

打个比方,假如把找工作明确成考大学,口试就是高考,市面上的“真题”就是模拟试卷。我们会很轻易倾向于在口试前探求对应公司的口试“真题”,重点预备,期待“押题”乐成。但实际上,即使口试同一家公司,它会有差异部分,差异业务线,差异口试官,即使遇到同一口试官,他也不肯定就每次观察完全一样的内容。想想高考中那些考的好的同砚,他们肯定不是靠“押题”才气取得好结果吧,他们大多靠的是平常积聚及对知识点机动把握,那口试也一样啊。执着于搜题,把口试题当做重点举行“复习”,还不如本身划出“考纲”,各个知识点逐一查抄把握环境,复习的更全面呢。
我对于口试题的见解不停是相对守旧的,这类文章一样平常只是内容搬运,它会存在一些偏差和误读,最紧张的那就是几道题往那一扔,并没有产出有代价的东西。这也是为什么我上篇口试总结,会加了一些口试本事,整理口试题时,也没提他们是出自哪家公司,就是不渴望各人把标题区别对待。
说了这些并不是说口试题没用啊,而是渴望各人不要迷信口试题,更多地去关注那些有质量有深度的技能文章。口试稽核的是知识点而不是详细的某些标题,口试题的作用在于,权衡我们的知识把握环境,便于我们查漏补缺,越说越像是针对一次“考试”了?。
口试题及参考答案

Swift

1、Swift中struct和class有什么区别?
struct是值引用,更轻量,存放于栈区,class是范例引用,存放于堆区。struct无法继承,class可继承。
2、Swift中的方法调用有哪些情势?
答:直接派发、函数表派发、消息机制派发。派发方式受声明位置,引用范例,特定举动的影响。为什么Swift有这么多派发情势?为了效率。
参考文章:深入明确 Swift 派发机制
3、Swift和OC有什么区别?
Swift和OC的区别有很多,这里扼要总结这几条:
SwiftObjective-C语言特性静态语言,更加安全动态语言,不那么安全语法更精简冗长定名空间有无方法调用直接调用,函数表调用,消息转发消息转发泛型/元组/高阶函数有无语言效率性能更高,速率更快略低文件特性.swift 单文件.h/.m包含头文件编程特性可以更好的实现函数式编程/相应式编程面向对象编程4、从OC向Swift迁移的时间遇到过什么标题?
可以参考这篇文章:OC项目转Swift指南 里的混编留意事项。
5、怎么明确面向协议编程?
面向对象是以对象的视角观察团体结构,万物皆为对象。
面向协议则是用协议的方式构造各个类的关系,Swift底层险些全部类都构建在协议之上。
面向协议可以或许办理面向对象的菱形继承,横切关注点和动态派发的安全性等标题。
参考喵神的面向协议编程与 Cocoa 的邂逅 (上)
OC语法

1、Block是怎样实现的?Block对应的数据结构是什么样子的?__block的作用是什么?它对应的数据结构又是什么样子的?
block本质是一个对象,底层用struct实现。
数据结构如下:
struct Block_descriptor {    unsigned long int reserved;    unsigned long int size;    void (*copy)(void *dst, void *src);    void (*dispose)(void *);};struct Block_layout {    void *isa;    int flags;    int reserved;    void (*invoke)(void *, ...);    struct Block_descriptor *descriptor;    /* Imported variables. */};

  • isa 指针,全部对象都有该指针,用于实现对象相干的功能。
  • flags,用于按 bit 位表现一些 block 的附加信息,本文背面先容 block copy 的实当代码可以看到对该变量的使用。
  • reserved,保存变量。
  • invoke,函数指针,指向详细的 block 实现的函数调用地点。
  • descriptor, 表现该 block 的附加形貌信息,重要是 size 巨细,以及 copy 和 dispose 函数的指针。
  • variables,capture 过来的变量,block 可以或许访问它外部的局部变量,就是由于将这些变量(或变量的地点)复制到告终构体中。
__block的作用是可以获取对应变量的指针,使其可以在block内部被修改。通过反编译的代码我们可以看到该对象是这样的:
struct __Block_byref_i_0 {    void *__isa;    __Block_byref_i_0 *__forwarding;    int __flags;    int __size;    int val; //变量名};对于block的深入相识,可以参考《Objective-C高级编程》第二章大概唐巧的这篇谈Objective-C block的实现
2、GCD中的Block是在堆上照旧栈上?
堆上。可以通过block的isa指针确认。
3、NSCoding协议是干什么用的?
一种编码协议,归档时息争档时必要依赖该协议界说的编码息争码方法。Foundation和Cocoa Touch中的大部分类都遵照了这个协议,一样平常被NSKeyedArchiver做自界说对象恒久化时使用。
4、KVO的实现原理
使用Runtime天生一个中央对象,让原对象的isa指针指向它,然后重写setter方法,插入willChangeValueForKey和didChangeValueForKey方法。当属性厘革时会调用,会调用这两个方法关照到外界属性厘革。
5、NSOperation有哪些特性,比着GCD有哪些长处,它有哪些API?
NSOperation是对GCD的封装,具有面向对象的特点,可以更方便的举行封装,可以设置依赖关系。
API可以查察NSOperation文档。
6、NSNotificaiton是同步照旧异步的,假如发关照时在子线程,吸收在哪个线程?
同步。子线程。
UI

1、变乱相应链是怎样转达的?
手势的点击会发生两个紧张变乱,变乱转达和变乱相应。
变乱转达:从UIApplication开始,到window,再渐渐往下层(子视图)找,直到找到最深层的子视图,其为first responder。用到的判断方法是pointInside:withEvent和hitTest:withEvent。
变乱相应:从辨认到的视图(first responder)开始验证可否相应变乱,假如不能就交给其上层(父视图)视图,假如能相应将不再往下转达,假如直到找到UIApplication层还没有相应,那就忽略该次点击。用到的判断方法是touchesBegan:withEvent、touchesMoved:withEvent等。
这两个过程大抵的相反的。
2、什么是异步渲染?
异步渲染就是在子线程举行绘制,然后拿到主线程表现。
UIView的表现是通过CALayer实现的,CALayer的表现则是通过contents举行的。异步渲染的实现原理是当我们改变UIView的frame时,会调用layer的setNeedsDisplay,然后调用layer的display方法。我们不能在非主线程将内容绘制到layer的context上,但我们单独开一个子线程通过CGBitmapContextCreateImage()绘制内容,绘制完成之后切回主线程,将内容赋值到contents上。
这个步调可以参照YYText中YYTextAsyncLayer.m文件中的实现方式。
3、layoutsubviews是在什么机遇调用的?

  • init初始化不会触发。
  • addSubview时。
  • 设置frame且前后值厘革,frame为zero且不添加到指定视图不会触发。
  • 旋转Screen会触发父视图的layoutSubviews。
  • 滚动UIScrollView引起View重新结构时会触发layoutSubviews。
4、一张图片的展示履历了哪些步调?
这个可以参考我之前写的一篇文章iOS开辟图片格式选择 中的前半部分内容。
5、什么是离屏渲染,什么环境会导致离屏渲染?
假如要在表现屏上表现内容,我们至少必要一块与屏幕像素数据量一样大的frame buffer,作为像素数据存储地域。假如偶尔由于面对一些限定,无法把渲染效果直接写入frame buffer,而是先暂存在别的的内存地域,之后再写入frame buffer,那么这个过程被称之为离屏渲染。
以阴影为例,为什么它会导致离屏渲染。由于GPU的渲染是遵照“画家算法”,一层一层绘制的,但阴影很特别,它必要全部内容绘制完成,再根据外表面举行绘制。这就导致了,阴影这一层要不停占据一块内存地域,这就导致了离屏渲染。
雷同导致离屏渲染的环境另有:

  • cornerRadius+clipsToBounds
  • group opacity 组透明度
  • mask 遮罩
  • UIBlurEffect 毛玻璃效果
有一篇文章详细的讨论了这些环境:关于iOS离屏渲染的深入研究
6、CoreAnimation这个框架的作用什么,它跟UIKit的关系是什么?
CoreAnimation固然直译是核心动画,但它着实是一个图像渲染框架,动画实现只是它的一部分功能。
看这张图我们可以知道,它是UIKit和AppKit的底层实现,位于Metal、Core Graphics和GPU之上之上。
苹果官方文档:About Core Animation
引用计数

1、ARC方案的原理是什么?它是在什么时间做的隐式添加release操纵?
ARC(Automatic Reference Cunting)主动引用计数,意即通过LLVM编译器主动管理对应的引用计数状态。ARC开启时无需再次键入retain大概release代码。
它是在编译阶段添加retain大概release代码的。
2、循环引用有哪些场景,怎样克制?
循环引用及两个及以上对象出现引用环,导致对象无法开释的环境。一样平常在block,delegate,NSTimer时轻易出现这个标题。
办理方案就是让环的此中一环节实现弱引用。
3、为什么当我们在使用block时表面是weak 声明一个weakSelf,还要在block内部使用strong再持有一下?
block外界声明weak是为了实现block对对象的弱持有,而内里的作用是为了包管在进到block时不会发生开释。
4、Autoreleasepool是实现机制是什么?它是什么时间开释内部的对象的?它内部的数据结构是什么样的?当我提到哨兵对象时,会继承问哨兵对象的作用是什么,为什么要设计它?
Autoreleasepool的原理是一个双向列表,它会对到场此中的对象实现耽误开释。当Autoreleasepool调用drain方法时会开释内部标志为autorelease的对象。
class AutoreleasePoolPage {    magic_t const magic;    id *next;    pthread_t const thread;    AutoreleasePoolPage * const parent;    AutoreleasePoolPage *child;    uint32_t const depth;    uint32_t hiwat;};哨兵对象雷同一个指针,指向主动开释池的栈顶位置,它的作用就是用于标志当前主动开释池必要开释内部对象时,开释到谁人地方竣事,每次入栈时它用于确定添加的位置,然后再次移动到栈顶。
关于主动开释池的底层探究可以看draveness的这篇主动开释池的宿世此生 ---- 深入分析 autoreleasepool
5、哪些对象会放入到Autoreleasepool中?
有两种环境天生的对象会到场到autoreleasepool中:

  • 非alloc/new/copy/mutablecopy 开始的方式初始化时。
  • id的指针或对象的指针在没有表现指定时
引用计数带来的一次讨论
6、weak的实现原理是什么?当引用对象烧毁是它是怎样管理内部的Hash表的?(这里要参阅weak源码)
runTime会把对weak修饰的对象放到一个全局的哈希表中,用weak修饰的对象的内存地点为key,weak指针为值,在对象举行烧毁时,用通过自身地点去哈希表中查找到全部指向此对象的weak指针,并把全部的weak指针置位nil。
Runtime

1、消息发送的流程是怎样的?
OC中的方法调用会转化成给对象发送消息,发送消息会调用这个方法:
objc_msgSend(receiver, @selector(message))该过程有以下关键步调:

  • 先确定调用方法的类已经都加载完毕,假如没加载完毕的话举行加载
  • 从cache中查找方法
  • cache中没有找到对应的方法,则到方法列表中查,查到则缓存
  • 假如本类中查询到没有用果,则遍历全部父类重复上面的查找过程,直到NSObject
2、关联对象时什么环境下会导致内存走漏?
关联对象可以明确就是持有了一个对象,假如是retain等方式的持有,而该对象也持有了本类,那就是导致了循环引用。
3、消息转发的流程是什么?
消息转发是发生在吸收者(receiver)没有找到对应的方法(method)的时间,该步调有如下几个关键步调:

  • 消息转发的时间,假如是实例方法会走resolveInstanceMethod:,假如是类方法会走resolveClassMethod:,它们的返回值都是Bool,必要我们确定是否举行转发。
  • 假如第一步返回YES,确定转发就会进到下个方法forwardingTargetForSelector,这个方法必要我们指定一个被用receiver。
  • methodSignatureForSelector用于指定方法署名,forwardInvocation用于处理惩罚Invocation,举行完备转发。
  • 假如消息转发也没有处理惩罚即为无法处理惩罚,会调用doesNotRecognizeSelector,引发瓦解。
更多相识可以参考iOS开辟·runtime原理与实践: 消息转发篇(Message Forwarding) (消息机制,方法未实现+API不兼容奔溃,模拟多继承)
4、category可否添加属性,为什么?可否添加实例变量,为什么?
可以添加属性,这里的属性指@property,但跟类里的@property又不一样。正常的@property为:实例变量Ivar + Setter + Getter 方法,分类里的@property这三者都没有,必要我们手动实现。
分类是运行时被编译的,这时类的结构已经固定了,以是我们无法添加实例变量。
对于分类自界说Setter和Getter方法,我们可以通过关联对象(Associated Object)举行实现。
5、元类的作用是什么?
元类的作用是存储类方法,同时它也是为了让OC的类结构可以或许形成闭环。
对于为甚设计元类有以下缘故起因;

  • 在OC的天下里一切皆对象(鉴戒于Smalltalk),metaclass的设计就是要为满意这一点。
  • 在OC中Class也是一种对象,它对应的类就是metaclass,metaclass也是一种对象,它的类是root metaclass,在往上根元类(root metaclass)指向本身,形成了一个闭环,一个完备的设计。
假如不要metaclass可不可以?也是可以的,在objc_class再加一个类方法指针。但是这样的设计会将消息转达的过程复杂化,以是为了消息转达流程的复用,为了一切皆对象的头脑,就有了metaclass。
关于这一话题的深入讨论可以参考这两篇文章:
为什么要存在MetaClass
为什么要设计metaclass
6、类方法是存储到什么地方的?类属性呢?
类方法和类属性都是存储到元类中的。
类属性在Swift用的多些,OC中很少有人用到,但着实它也是有的,写法如下:
@interface Person : NSObject// 在属性种别中加上class@property (class, nonatomic, copy) NSString *name;@end// 调用方式NSString *temp = Person.name;必要留意的是跟实例属性不一样,类属性不会主动天生实例变量和setter,getter方法,必要我们手动实现。详细实现方法可以参考这个文章:Objective-C Class Properties
7、讲几个runtime的应用场景

  • hook体系方法举行方法互换。
  • 相识一个类(闭源)的私有属性和方法。
  • 关联对象,实现添加分类属性的功能。
  • 修改isa指针,自界说KVO。
Runloop

1、讲一下对Runloop的明确?
Runloop就是一个运行循环,它包管了在没有使命的时间线程不退出,有使命的时间即使相应。Runloop跟线程,变乱相应,手势辨认,页面更新,定时器都有着精密接洽。
深入相识保举ibireme的这篇深入明确RunLoop
2、可以用Runloop实现什么功能?

  • 检测卡顿
  • 线程保活
  • 性能优化,将一些耗时操纵放到runloop wait的环境处理惩罚。
性能优化

1、对TableView举行性能优化有哪些方式?

  • 缓存高度
  • 异步渲染
  • 镌汰离屏渲染
2、Xcode的Instruments都有哪些调试的工具?


  • Activity Monitor(运动监督器):监控进程的CPU、内存、磁盘、网络使用环境。是步调在手机
    运行真正占用内存巨细
  • Allocations(内存分配):跟踪过程的匿名假造内存和堆的对象提供类名和可选保存/开释汗青
  • Core Animation(图形性能):表现步调显卡性能以及CPU使用环境
  • Core Data:跟踪Core Data文件体系运动
  • Energy Log:耗电量监控
  • File Activity:检测文件创建、移动、厘革、删除等
  • Leaks(走漏):一样平常的步调内存使用环境,查抄走漏的内存,并提供了全部运动的分配和走漏模块的类对象分配统计信息以及内存地点汗青记载
  • Network:用链接工具分析你的步调怎样使用TCP/IP和UDP/IP链接
  • System Usage:记载关于文件读写,sockets,I/O体系运动,输入输出
  • Time Profiler(时间探查):方法实验耗时分析
  • Zombies:丈量一样平常的内存使用,专注于检测太过开释的野指针对象。也提供对象分配统计以及主动分配的内存地点汗青
3、讲一下你做过的性能优化的变乱。
这个根据本身环境来说吧。
4、怎样检测卡顿,都有哪些方法?

  • FPS,通过CADisplayLink计算1s内革新次数,也可以使用Instruments里的Core Animation。
  • 使用Runloop,实时计算 kCFRunLoopBeforeSources 和 kCFRunLoopAfterWaiting 两个状态地域之间的耗时是否高出某个阀值
  • 子线程检测,每次检测时设置标志位为YES,然后派发使命到主线程中将标志位设置为NO。接着子线程甜睡超时阙值时长,判断标志位是否乐成设置成NO,假如没有阐明主线程发生了卡顿。参考ANREye的实现
5、缩小包体积有哪些方案?

  • 图片压缩,无用图片删除
  • 一些大图可以动态下发
  • 删除无用类,无用方法
  • 镌汰三方库的依赖
计算机相干

1、项目编译的流程是什么?手机上的应用步调自点击图标开始到首屏内容展示都履历了哪些步调?
编译流程:

  • 预处理惩罚:处理惩罚宏界说,删除表明,睁开头文件。
  • 词法分析:把代码切成一个个token,好比巨细括号即是号另有字符串
  • 语法分析:验证语法是否准确,合成抽象语法树AST
  • 静态分析:查找代码错误
  • 范例查抄:动态和静态
  • 目的代码的天生与优化,包罗删除多余指令,选择符合的寻址方式,假如开启了bitcode,会做进一步的优化
  • 汇编:由汇编器天生汇编语言
  • 呆板码:由汇编语言转成呆板码,天生.o文件
应用启动的流程:
启动的条件是完成编译,运行步调即运行编译过后的目的步调,它分为main函数前和main函数后:
main前

  • 加载可实验文件(App的.o文件聚集)
  • 加载动态链接库(体系和应用的动态链接库),举行rebase指针调解和bind符号绑定
  • Objc运行时的初始处理惩罚,包罗Objc相干类的注册,category注册,selector唯一性查抄
  • 初始化,包罗实验+load()、attribute(constructor)修饰的函数的调用、创建C++静态全局变量
main后

  • 首页初始化所必要设置文件的读写操纵
  • 首页界面渲染
2、对于根本数据范例,一样平常是存储到栈中的,它有没有大概存在堆上,什么环境下会存储到堆上?
栈和堆都是同属一块内存,只不外一个是高地点往低地点存储,一个从低地点往高地点存储,他们并没有严酷的界限说一个值只能放在堆上大概栈上。以是根本数据范例也是可以存储到堆上的。
当该基础范例变量被__block捕捉时,该变量连同block都会被copy到堆上。
3、数据库中的变乱是什么意思?
变乱就是访问并操纵各种数据项的一个数据库操纵序列,这些操纵要么全部实验,要么全部不实验。假如此中一个步调堕落就要打消整个操纵,回滚到进入变乱之前的状态。
4、使用过什么数据库(我复兴的Sqlite,Realm),Realm在使用时有哪些留意事项,怎样实现批量操纵?
对于Realm感爱好的同砚可以看下其官方文档。
Realm必要留意的重要就是不能直接跨线程访问同一对象。
批量操纵可以在一个单独的变乱中实验多个数据库的修改。
5、LRU算法是否相识,怎样实现一套LRU算法?
LRU(Least recently used 近来最少使用)算法是一个缓存镌汰算法,其作用就是当缓存很多时,该镌汰哪些内容,见名知意,它的核心头脑是镌汰近来使用最少的内容。实现它的关键步调是:

  • 新数据插入到链表的头部
  • 每当缓存掷中时,则将数据移动到链表头部
  • 链表满时,将尾部数据清除
这个算法在SDWebImage和Kingfisher等必要处理惩罚缓存的库中都有实现。
6、知道哪些设计模式,怎么明确设计模式的作用?
工厂模式、观察者模式、中介者模式、单例模式。这个根据实际环境说吧。
7、假如有1000万个Int范例的数字,怎样对他们排序?
这里的埋伏寄义是,内存不敷用时怎样排序,另有一个埋伏寄义是硬盘充足大。这是可以接纳分而治之的方法,将数据分成多少块,使每一小块满意当前内容巨细,然后对每块内容单独排序,末了接纳归并排序对全部块举行排序,就得到了一个有序序列。
8、设计一套数据库方案,实现雷同微信的搜刮关键词能快速检索出包含该字符串的谈天信息,并展示对应数目(谈天记载的数据量较大)
可以对谈天记载的文本值加上索引。正常环境下数据库搜刮都是全量检索的,加上索引之后只会检索满意条件的记载,大大低落检索量。
简历相干标题

1、Lottie实现动画效果的原理是什么?
iOS里的动画根本都是基于CoreAnimation里的API实现的,Lottie也是云云。在AE上实现动画效果,通过插件导出对应的json文件,Lottie的库分析该json,转成对应的体系API方法。图片的引用可以使用Base64编到json里,也可以通过项目集成,通过路径引用。
2、OClint实现静态分析的原理是什么,它是怎样做到的?
详细可以参考我之前写的怎样通过静态分析提高iOS代码质量。
3、MVVM和MVC有什么区别?
对比架构时,可以从是否职责分离,可测试性,可易维护性三个维度对比。
更多对比可以参考我翻译的一篇文章:【译】iOS 架构模式--浅析MVC, MVP, MVVM 和 VIPER
4、静态库和动态库的区别是什么?
静态库:链接时被完备复制到可实验文件中,多次使用就多份拷贝。
动态库:链接时不复制,而是由体系动态加载到内存,内存中只会有一份该动态库。
5、相识Flutter吗?它有没有使用UIKit?它是怎样渲染UI的?
UIKit是基于CoreAnimation渲染的,而Flutter并没有用到它,而是本身基于C++实现了一套渲染框架。
6、二进制重排的核心依据是什么?
修改链接次序,镌汰启动时的缺页停止。
实践步调可以参考李斌同砚的这篇iOS 优化篇 - 启动优化之Clang插桩实现二进制重排
7、怎样设计一套切换主题的方案?
核心思绪是观察者模式+协议(关照),当获取到主题切换时,关照各个实现了主题协议的类举行更新。
8、AVPlayer和IJKPlayer有什么区别?用IJKPlayer怎样实现一个缓存视频列表每条视频前1s的内容?
由于对IJKPlayer和FFmpeg相识的不是很深,这个我也没有确切答案,假如有相识的小伙伴可以品评告知我。
9、雷同微博的短视频列表,滑动停顿播放,怎样实现?
这个重要就是检测contentOffset和屏幕中央位置,设置一些界限条件,处理惩罚滑动过程中的切换举动。
10、使用python做过哪些事?怎样明确脚本语言?
多语言管理,csv多语言文件读取,然后写入到项目Localizable.strings中;抓取项目中的多语言字符串。
脚本(script) 着实就是一系列指令,计算机看了指令就知道本身该做什么变乱。像常见的Python,Shell,Ruby都是脚本语言,他们通常不必要编译,通过表明器运行。
数据结构与算法

1、什么是Hash表,什么是Hash碰撞,办理Hash碰撞有什么方法?
哈希表(Hash Table,也叫散列表),是根据关键码值 (Key-Value) 而直接举行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记载,以加快查找的速率。我们常用的Dictionary就是一种Hash表。
那什么是Hash碰撞呢,我们知道Hash表的查找是通过键值举行定位的,当两个差异的输入对应一个输出时,即为Hash碰撞,也被称为Hash辩论。
假如使用字典的例子你大概遐想不到辩论的环境,我们假设另一种环境:假设hash表的巨细为9(即有9个槽),如今要把一串数据存到表里:5,28,19,15,20,33,12,17,10。我们使用的hash函数是对9取余。这样的话会出现hash(5)=5,hash(28)=1,hash(19)=1。28和19都对应一个地点,这就出现了Hash辩论。
办理Hash辩论的方式有开放定址法和链地点法。
2、怎样遍历二叉树?
二叉树的遍历有三种方式,对于上面这棵二叉树,他们的遍历效果为:
前序遍历:根节点 > 左子节点 > 右子节点。
10,6,4,8,14,12,16
中序遍历:左子节点 > 根节点 > 右子节点。
4,6,8,10,12,14,16
后序遍历:左子节点 > 右子节点 > 根节点。
4,8,6,12,16,14,10
3、简述下快速排序的过程,时间复杂度是多少?
快排的头脑是通过一趟排序将要排序的数据分割成独立的两部分,此中一部分的全部数据都比别的一部分的全部数据都要小,然后再按此方法对这两部分数据分别举行快速排序,整个排序过程可以递归举行。
一个简单的Swift实现方式如下:
func quicksort<T: Comparable>(_ a: [T]) -> [T] {  guard a.count > 1 else { return a }  let pivot = a[a.count/2]  let less = a.filter { $0 < pivot }  let equal = a.filter { $0 == pivot }  let greater = a.filter { $0 > pivot }  return quicksort(less) + equal + quicksort(greater)}快速排序是有好几种的,他们的区别在于怎样实现filter和分区基准值的选取。
快排的时间复杂度是O(nlogn),空间复杂度是O(logn)
4、有一个整数数组,怎样只遍历一遍就实现让该数组奇数都在前面,偶数都在背面?
这个是《剑指offer》里的一道题,leedcode也有对应标题:剑指offer 21
这个相对比力简单,由于不要求有序,可以接纳收尾遍历的方式,举行互换,我这有个参考答案:
func sorted( _ nums: inout [Int]) -> [Int] {    guard !nums.isEmpty else {        return []    }    var start = 0    var end = nums.count - 1    while start < end {        if nums[start] % 2 != 0 {            start += 1            continue        }        if nums[end] % 2 == 0 {            end -= 1            continue        }        (nums[start], nums[end]) = (nums[end], nums[start])    }    return nums}5、假设你正在爬楼梯。必要 n 阶你才气到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种差异的方法可以爬到楼顶呢?
leetcode 20
6、给出一个 32 位的有符号整数,你必要将这个整数中每位上的数字举行反转
leetcode 7
7、有红、黄、蓝三种颜色的气球。在牛客王国,1个红气球+1个黄气球+1个蓝气球可以兑换一张彩票
2个红气球+1个黄气球可以兑换1个蓝气球。
2个黄气球+1个蓝气球可以兑换1个红气球。
2个蓝气球+1个红气球可以兑换1个黄气球。
如今牛牛有a个红气球,b个黄气球, c个蓝气球,牛牛想知道本身最多可以兑换多少张彩票。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2025-6-28 14:24, Processed in 0.164357 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表