最新整理的笔试题,由群里某某群友提供的题目,笔者整理并在此提供参考答案。
招聘高峰期来了,大家都非常积极地准备着跳槽,那么去一家公司面试就会有一堆新鲜的问题,可能不会,也可能会,但是了解不够深。本篇文章为群里的小伙伴们去某公司的笔试题,由笔者整理并提供笔者个人参考答案。注意,仅供参考,不代表绝对正确。
参考答案不唯一,大家可以根据自己的理解回答,没有必要跟笔者的一样。参考笔者的答案,也许给你带来灵感!
A. 可随机访问任何一个元素
B. 插入,删除操作不需要移动元素
C. 无需事先估计存储空间大小
D. 所欲存储空间可以是不连续的
这道题是考大学时所学的链表知识,其实笔者也忘了很多了。因为在大学时,曾经自己写过很多链表相关的代码,再加上经常帮同学调试,以及帮助同学讲解链表相关知识点,因此记忆较深。以下答案纯属个人认知,非百度而来,若有不对之处,请指出。
链表不同于数组。链表之所有叫链表,就是像一条链一样,要过到某个节点处,就得遍历着找;而数组才具备随机访问任何一个元素的能力,数组可以通过索引直接访问元素,时间复杂度为常量,效率非常高,因此在某些场合上,我们需要数组这样的数据结构。
B. 链表的插入、删除都不需要移动元素,只需要修改指针的指向就可以了,因为链表上的每个节点都是动态分配的,分配在堆上,通过指针来指向每个节点的内存区,要获取某个节点的值,是需要遍历一遍才能找到对应的节点的。
C. 因为链表上的每个节点是分配在堆上,需要开发人员手动申请内存空间的,因此不像数组在定义时就要指定存储空间大小。对于链表,需要增加一个节点时,直接在堆上申请。当需要删除某个节点时,可以直接将该节点的内存给释放掉。
D. 因为链接中的节点都是存储在堆上的,而每个节点之间都有一个指向前一个节点和后一个节点的指针,只要知道链表头指针,就可以通过遍历查找到任何一个节点。因此,链表不同于数组,数组是要连续的内存存储空间,才能保证以常量时间复杂度快速访问任意元素;而链表不要求每个节点是连接,在堆上申请的内存空间很难得到连续的,而且空间产生内存碎片。
A. 多进程里,子进程可获取父进程的所有堆和栈的数据;而线程会与同进程的其他线程共享数据,拥有自己的栈空间。
B. 线程因为有自己的独立栈空间且共享数据,所有执行的开销相对较大,同时不利于资源管理和保护。
C. 线程的通信速度更快,切换更快,因为他们在同一地址空间内。
D. 线程使用公共变量/内存时需要使用同步机制,因为他们在同一地址空间内。
这道题要求不创建新的实例,只有a、b两个变量,要交换这两个变量的值,通常的做法是使用临时变量来临时存储,但是现在要求不使用新的实例,那么有什么办法呢?
方法就是通过位运算来操作:
a = a ^ b; b = a ^ b; a = a ^ b;
对于题目中的a = 19,也就是对应二进制 00010011 ;而b=29,也就是对应二进制 00011101
注意,
符号表示按位异或。所谓按位异或是指对应位置上的二进制数值相同为0,不同为1。
笔者之前写过这篇文章讲了讲开发中常见的内存循环引用的案例:
iOS Block循环引用精讲
笔者也不是很确定,iOS里的序列化是指归档、JSON序列化吗?实际上归档也就是将对象转换成XML、JSON序列化也就是将对象转换data。
NSLog(@"%s", __FUNCTION__); NSDictionary *dict = @{@"key" : @"value", @"key1" : @"value1", @"key2" : @"value2"}; NSData *data = [NSJSONSerializationdataWithJSONObject:dictoptions:NSJSONWritingPrettyPrintederror:nil]; NSLog(@"%@", [[NSString alloc]initWithData:dataencoding:NSUTF8StringEncoding]);
将对象归档:需要遵守NSCoding协议,实现如下方法:
- (void)encodeWithCoder:(NSCoder *)aCoder { [aCoderencodeObject:self.titleforKey:@"title"]; }
如果所谓的序列化不是指这两种,还请高人指点。
不知道说得合不合适,还请高人提出还有哪些方式?
想要更深入,不防看看大牛的文章吧: iOS 保持界面流畅的技巧
设计API的基本准则是:
要想让全工程使用起来非常方便,那最好的方式就是使用单例,比如SVProgressHUD就是通过单例的方式来操作的。将单例封闭在内部,外部并不知道是单例,而外部的调用全是通过类方法的形式来调用,代码调用是非常简化的。使用单例的优点是方便管理和调用。缺点就是一直占用内存而不释放。
当然,我们也可以通过正常的对象创建,在哪里使用就在哪里创建一个对象,自己来管理。这样的方式在使用的地方不是那么方便,还需要再单独进行一层封装,以方便直接调用。但这种方式的好处就是在不需要使用的时候可以释放掉;缺点就是如果同时创建了多个HUD来显示时,需要调用者使用代码逻辑来控制之前的显示与隐藏或者切换文本等。
笔者觉得,使用单例方式更方便调用一些,外部也不用通过逻辑来管理多个HUD的显示与隐藏问题,都封装到内部,由封装库的人来维护。
假设设计一个HYBProgressHUB的小例子,随手写的,没有真实写完整:
typedef NS_ENUM(NSUInteger, HYBProgressHUBMaskType) { kHYBProgressHUBClear, kHYBProgressHUBBlack, kHYBProgressHUBUserEnabled }; @interfaceHYBProgressHUD: NSObject + (void)setDefaultMaskType:(HYBProgressHUBMaskType)defaultMaskType; + (void)show; + (void)showWithText:(NSString *)text; + (void)showWithImage:(NSString *)image; + (void)showWithText:(NSString *)textimage:(UIImage *)image; + (void)showWithText:(NSString *)textmaskType:(HYBProgressHUBMaskType)maskType; + (void)showWithImage:(NSString *)image maskType:(HYBProgressHUBMaskType)maskType; + (void)showWithText:(NSString *)textimage:(UIImage *)image maskType:(HYBProgressHUBMaskType)maskType; + (void)dismiss; + (void)dismissWithText:(NSString *)text; + (void)dismissWithImage:(UIImage *)image; + (void)dismissWithText:(NSString *)textimage:(UIImage *)image; @end
将单例放在实现文件中,并没有暴露出来:
@implementation HYBProgressHUD + (instancetype)sharedInstance { __blockHYBProgressHUD *singleTon = nil; static dispatch_once_tonceToken; dispatch_once(&onceToken, ^{ singleTon = [[[self class]alloc]init]; }); return singleTon; } @end
因为根据不同的需求,不同的场景,show会有很多种形式,比如不可点击、可点击、是否半透明等,因此API也应该针对单一性原则提供对应的API。但是,一个App中大部分的HUD显示的样式、方式是相同的,因此,我们可以提供一个默认的全局的呈现样式,比如调用show这个API要显示的样式就是默认的样式,若不调用,内部也会给一个默认值。
对于dismiss也一样,可以是直接隐藏,也可以在隐藏之前先提示点什么,比如纯文本提示、纯图片提示、文本和图片组合提示等。
当然,我们还可以扩展API设置dismiss的默认显示图片和文字的样式:
typedef NS_ENUM(NSUInteger, HYBProgressHUBDismissType) { kHYBProgressHUBDismissSuccess, kHYBProgressHUBDismissFailed, kHYBProgressHUBDismissWarnings, kHYBProgressHUBDismissTimeout }; + (void)dismissWithText:(NSString *)texttype:(HYBProgressHUBDismissType)type;
比如在所有的网络请求的地方,就可以写一个通用的API,在成功与失败回调处,统一处理显示不同的类型提示。
上面所描述内容为笔者纯手工尝试设计的,不代表足够合理,写出来的最主要目的是抛砖引玉,当然我更希望能够有大神出来指出其中的不足或者加以补充,让后来者少走弯路。
本来不太想整理这份笔试题的,但是对于其中的几道题确实很需要认真地思考,另外也希望得到大神们的评论,指出其中的缺陷,或者能够加以补充。请各位大神们,注入新鲜的血液吧!
关注 | 账号 | 备注 |
---|---|---|
Swift/ObjC技术群一 | 324400294 | 群一若已满,请申请群二 |
Swift/ObjC技术群二 | 494669518 | 群二若已满,请申请群三 |
Swift/ObjC技术群三 | 461252383 | 群三若已满,会有提示信息 |
关注微信公众号 | iOSDevShares | 关注微信公众号,会定期地推送好文章 |
关注新浪微博账号 | 标哥Jacky | 关注微博,每次发布文章都会分享到新浪微博 |
关注标哥的GitHub | CoderJackyHuang | 这里有很多的Demo和开源组件 |
关于我 | 进一步了解标哥 | 如果觉得文章对您很有帮助,可捐助我! |
版权声明:本文为【标哥的技术博客】原创出品,欢迎转载,转载时请注明出处!