Erlo

iOS之2016面试题一

2019-08-15 12:03:34 发布   954 浏览  
页面报错/反馈
收藏 点赞

文章转载自:http://www.pythonheidong.com/blog/article/3337/

序言

招聘高峰期来了,大家都非常积极地准备着跳槽,那么去一家公司面试就会有一堆新鲜的问题,可能不会,也可能会,但是了解不够深。本篇文章为群里的小伙伴们去宝库公司的笔试题,由笔者整理并提供笔者个人参考答案。注意,仅供参考,不代表绝对正确。

参考答案不唯一,大家可以根据自己的理解回答,没有必要跟笔者的一样。参考笔者的答案,也许给你带来灵感!

1、对数组中的元素去重复

例如:

参考答案:

  • 第一种方法:开辟新的内存空间,然后判断是否存在,若不存在则添加到数组中,得到最终结果的顺序不发生变化。效率分析:时间复杂度为O ( n2 ):

 

 

1

2

3

4

5

6

7

8

9

10

11

12

 

NSMutableArray *resultArray = [[NSMutableArray alloc] initWithCapacity:array.count];

// 外层一个循环

for (NSString *item in array) {

   // 调用-containsObject:本质也是要循环去判断,因此本质上是双层遍历

   // 时间复杂度为O ( n^2 )而不是O (n)

    if (![resultArray containsObject:item]) {

      [resultArray addObject:item];

    }

}

NSLog(@"resultArray: %@", resultArray);

 

补充:原来集合操作可以通过valueForKeyPath来实现的,去重可以一行代码实现:

 

1

2

3

4

 

array = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];

NSLog(@"%@", array);

 

但是返回的结果是无序的,与原来的顺序不同。大家可以阅读:Collection Operators

  • 第二种方法:利用NSDictionary去重,字典在设置key-value时,若已存在则更新值,若不存在则插入值,然后获取allValues。若不要求有序,则可以采用此种方法。若要求有序,还得进行排序。效率分析:只需要一个循环就可以完成放入字典,若不要求有序,时间复杂度为O(n)。若要求排序,则效率与排序算法有关:

 

 

1

2

3

4

5

6

7

8

 

NSMutableDictionary *resultDict = [[NSMutableDictionary alloc] initWithCapacity:array.count];

for (NSString *item in array) {

    [resultDict setObject:item forKey:item];

}

NSArray *resultArray = resultDict.allValues;

NSLog(@"%@", resultArray);

 

如果需要按照原来的升序排序,可以这样:

 

1

2

3

4

5

6

7

8

 

resultArray = [resultArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {

  NSString *item1 = obj1;

  NSString *item2 = obj2;

  return [item1 compare:item2 options:NSLiteralSearch];

}];

NSLog(@"%@", resultArray);

 

 

  • 第三种方法:利用集合NSSet的特性(确定性、无序性、互异性),放入集合就自动去重了。但是它与字典拥有同样的无序性,所得结果顺序不再与原来一样。如果不要求有序,使用此方法与字典的效率应该是差不多的。效率分析:时间复杂度为O (n):

 

 

1

2

3

4

5

 

NSSet *set = [NSSet setWithArray:array];

NSArray *resultArray = [set allObjects];

NSLog(@"%@", resultArray);

 

如果要求有序,那就得排序,比如这里要升序排序:

 

1

2

3

4

5

6

7

8

 

resultArray = [resultArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {

  NSString *item1 = obj1;

  NSString *item2 = obj2;

  return [item1 compare:item2 options:NSLiteralSearch];

}];

NSLog(@"%@", resultArray);

 

补充:

一直没有使用过有序集合,网友们反馈到可以直接使用有序集合,感谢大家:

 

1

2

3

4

 

NSOrderedSet *set = [NSOrderedSet orderedSetWithArray:array];

NSLog(@"%@", set.array);

 

以上三种方法是笔者所能想到的办法。如果大家有更好的办法,欢迎在评论中指出。

2、说说以下元素的特性和作用

 

 

1

2

3

 

NSArray、NSSet、NSDictionary与NSMutableArray、NSMutableSet、NSMutableDictionary

 

参考答案:

特性:

  • NSArray表示不可变数组,是有序元素集,只能存储对象类型,可通过索引直接访问元素,而且元素类型可以不一样,但是不能进行增、删、改操作;NSMutableArray是可变数组,能进行增、删、改操作。通过索引查询值很快,但是插入、删除等效率很低。
  • NSSet表示不可变集合,具有确定性、互异性、无序性的特点,只能访问而不能修改集合;NSMutableSet表示可变集合,可以对集合进行增、删、改操作。集合通过值查询很快,插入、删除操作极快。
  • NSDictionary表示不可变字典,具有无序性的特点,每个key对应的值是唯一的,可通过key直接获取值;NSMutableDictionary表示可变字典,能对字典进行增、删、改操作。通过key查询值、插入、删除值都很快。

作用:

  • 数组用于处理一组有序的数据集,比如常用的列表的dataSource要求有序,可通过索引直接访问,效率高。
  • 集合要求具有确定性、互异性、无序性,在iOS开发中是比较少使用到的,笔者也不清楚如何说明其作用
  • 字典是键值对数据集,操作字典效率极高,时间复杂度为常量,但是值是无序的。在ios中,常见的JSON转字典,字典转模型就是其中一种应用。

3、简单描述一下XIB与Storyboards,说一下他们的优缺点。

参考答案:

笔者倾向于纯代码开发,所以所提供的参考答案可能具有一定的个人感情,不过还是给大家说说笔者的想法。

优点:

  • XIB:在编译前就提供了可视化界面,可以直接拖控件,也可以直接给控件添加约束,更直观一些,而且类文件中就少了创建控件的代码,确实简化不少,通常每个XIB对应一个类。
  • Storyboard:在编译前提供了可视化界面,可拖控件,可加约束,在开发时比较直观,而且一个storyboard可以有很多的界面,每个界面对应一个类文件,通过storybard,可以直观地看出整个App的结构。

缺点:

  • XIB:需求变动时,需要修改XIB很大,有时候甚至需要重新添加约束,导致开发周期变长。XIB载入相比纯代码自然要慢一些。对于比较复杂逻辑控制不同状态下显示不同内容时,使用XIB是比较困难的。当多人团队或者多团队开发时,如果XIB文件被发动,极易导致冲突,而且解决冲突相对要困难很多。
  • Storyboard:需求变动时,需要修改storyboard上对应的界面的约束,与XIB一样可能要重新添加约束,或者添加约束会造成大量的冲突,尤其是多团队开发。对于复杂逻辑控制不同显示内容时,比较困难。当多人团队或者多团队开发时,大家会同时修改一个storyboard,导致大量冲突,解决起来相当困难。

4、请把字符串2015-04-10格式化日期转为NSDate类型

参考答案:

 

1

2

3

4

5

6

7

8

9

 

NSString *timeStr = @"2015-04-10";

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

formatter.dateFormat = @"yyyy-MM-dd";

formatter.timeZone = [NSTimeZone defaultTimeZone];

NSDate *date = [formatter dateFromString:timeStr];

// 2015-04-09 16:00:00 +0000

NSLog(@"%@", date);

 

 

5、在App中混合HTML5开发App如何实现的。在App中使用HTML5的优缺点是什么?

参考答案:

在iOS中,通常是通常UIWebView来实现,当然在iOS8以后可以使用WKWebView来实现.有以下几种实现方法:

  • 通过实现UIWebView的代理方法来拦截,判断scheme是否是约定好的,然后iOS调用本地相关API来实现:

 

 

1

2

3

 

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

 

 

优缺点:

  • iOS加入H5响应比原生要慢很多,体验不太好,这是缺点。
  • iOS加入H5可以实现嵌入别的功能入口,可随时更改,不用更新版本就可以上线,这是最大的优点

6、请描述一下同步和异步,说说它们之间的区别。

参考答案:

首先,我们要明确一点,同步和异步都是在线程中使用的。在iOS开发中,比如网络请求数据时,若使用同步请求,则只有请求成功或者请求失败得到响应返回后,才能继续往下走,也就是才能访问其它资源(会阻塞了线程)。网络请求数据异步请求时,不会阻塞线程,在调用请求后,可以继续往下执行,而不用等请求有结果才能继续。

区别:

  • 线程同步:是多个线程访问同一资源时,只有当前正在访问的线程访问结束之后,其他线程才能开始访问(被阻塞)。
  • 线程异步:是多个线程在访问竞争资源时,可以在空闲等待时去访问其它资源(不被阻塞)。

7、请简单描述一下队列和多线程的使用原理。

 

参考答案:

在iOS中队列分为以下几种:

  • 串行队列:队列中的任务只会顺序执行

 

 

1

2

3

 

dispatch_queue_t q = dispatch_queue_create("...", DISPATCH_QUEUE_SERIAL);

 

 

  • 并行队列: 队列中的任务通常会并发执行

 

 

1

2

3

 

dispatch_queue_t q = dispatch_queue_create("......", DISPATCH_QUEUE_CONCURRENT);

 

 

  • 全局队列:是系统的,直接拿过来(GET)用就可以;与并行队列类似

 

 

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认