题目:

(参考:陈曦 包子的iOS开发)
我在code review的时候,发现了某个viewController中有这样一段代码,觉得很不妥当,请尝试找出代码中的任何问题,或者可以优化的部分。

-(int)searchMaxNumber:(NSArray *)numbers
{
int maxNumber;
[numbers enumerateObjectsUsingBlock:^(NSNumber* _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)
{
int intNumber = obj.intValue;
if (intNumber > maxNumber)
{
maxNumber = intNumber;
}
}];
return maxNumber;
}

很多面试者第一反应都是,好像是没什么问题啊。如果再仔细的看一下代码,如果再次回答没什么问题,那么这个人基本可以被淘汰了。

初级问题

1. maxNumber没有初始值。如果numbers里面都是负数的话,返回值为0,结果不对。

解释:这个问题是必须要回答出来的,读代码是最基本的能力。

2. maxNumber变量没有加 __block修饰。这其实是一段编译不过的代码。

解释:如果这个答不上也不要紧,经过提示让面试者答出block中不能修改变量值就行了。

进阶问题

1. 函数代码位置有问题

解释:一个求数组最大值的函数,是很有可能被复用的,这段代码应该写在项目的基础公共类库中。可以写成一个公共类的类函数,或者一个数组的category等等,题目里写在一个VC中就很容易出现重复造轮子的现象了。

2. 这个函数设计的有问题,返回值预期并不明确

解释:很多面试者都会提到,检查输入的numbers是不是为空,如果为空了怎么做呢?返回0还是-1?或者是NSIntegerMin?调用的人可能也会有此疑惑,所以我更希望面试者将这个函数改为
-(NSInteger)findMaxNumberIndex:(NSArray)array
或者
-(NSNumber
)findMaxNumber:(NSArray*)array
这样的函数,可以让调用者更容易预测该函数的运作。

优化部分

1. 函数效率还可以优化

解释:关于这一点,其实很多人觉得iOS上即使有这种数组也不会很大的量,找个最大值也不会很慢。但是纯粹为了开发速度而且数组长度已知很少的业务场景下,我完全不介意使用[numbers valueForKeyPath:@"@max.intValue"]这样的方式,而且坑更少,甚至都不用额外写个函数了。但是如果要写一个单独的函数来处理还是用for循环吧,毕竟可以节省一个block对象。

2. 参数的处理的优化

解释:万一一堆int里面混了两个float怎么办? 这个float又是最大的怎么办? 其实只需要使用[NSNumber compare:]方法就好了,管他里面是什么类型呢。

3.其他比较散的优化点,例如这个数组来源是不是JSON啊,是不是支持字符串的数字啊,外部调用如何更好看等等,能答上的当然越多越好。

整理了以上思路,再权衡性能的情况下并未处理数字字符串,多线程等情况,修改后的代码如下,希望可以给大家带来一些帮助。

@interface NSArray (searchMaxNumber)
@property (nonatomic ,readonly) NSNumber *maxNumber; @end
@implementation NSArray (searchMaxNumber)
-(NSNumber *)maxNumber
{
NSNumber *maxNumber = nil;
Class numberClass = [NSNumber class];
for (NSNumber *num in self)
{
if (![num isKindOfClass:numberClass])
{
continue;
}
if ([maxNumber compare:num]!= NSOrderedDescending)
{
maxNumber = num;
}
}
return maxNumber;
} @end
文/Jack__yang(简书作者)
原文链接:http://www.jianshu.com/p/8029b504a4c2
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

一道简单的IOS面试题-b的更多相关文章

  1. 一道简单的JavaScript面试题

    好久没更新博客了,随便写点东西吧. 自从工作之后就特别忙,忙的过程中有时候挺迷茫的,可能是大多数时候写的都是简单的业务代码,很久没好好充电了.最近一直在零碎的上班路上等电梯时间里面学习<图解HT ...

  2. 一道简单的 Java 笔试题,但值得很多人反思!

    前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问什么深入的技术问题,只问一些广泛的.基础的.我只要 ...

  3. 一道简单的HashMap面试题所想到的...

    前言 看到一个JDK1.7和JDK1.8中关于HashMap的一个面试题: JDK1.7和1.8中HashMap中链表的插入的方式有什么不同? 原以为自己对HashMap的源码理解的还算可以了,应该足 ...

  4. 一道简单的python面试题-购物车

    要求实现:1.程序开始运行时要求手动填入工资金额2.然后展示一份带有价格的商品列表3.选择某个商品,足够金额购买就添加到购物车,否则提示无法购买4.退出后列出购物车清单 #!/usr/bin/pyth ...

  5. 一道简单的面试题,难倒各大 Java 高手!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 最近栈长在我们的<Java技术栈知识星球>上分享的一道 Java 实战面试题,很有意思,现在拿出来和大家分享下, ...

  6. 最全的iOS面试题及答案-转载

    1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承:可以实现多个接口,通过实现 ...

  7. iOS面试题及答案2015.6.7

    iOS面试题及答案     1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承 ...

  8. iOS 面试题 总结

    #include <iostream> using namespace std; int main () { char p[]={'a','b','c'}, q[]="abc&q ...

  9. [转载]iOS面试题总

    转载自:http://blog.sina.com.cn/s/blog_67eb608b0101r6xb.html (2014-06-13 20:23:33) 转载▼ 标签: 转载   crash 原文 ...

随机推荐

  1. ConcurrentHashMap和Hashtable区别

    Hashtable:synchronized是针对整张Hash表的,即每次锁住整张表让线程独占安全的背后是巨大的浪费 ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以 ...

  2. hdu 3333 树状数组

    思路:定义一个map容器用来记录数ai上次出现的位置.将查询区间按右边界升序进行排序,当插入第i个数ai时,pre[ai]+1---->i的区间就会多一个不同的数,其值就是ai,那么可以用upd ...

  3. C# 文件的读取、写入和删除

    class Program { static void Main(string[] args) { EmployeeDAL DAL = new EmployeeDAL(); List<Sys_E ...

  4. Linux时间函数

    一.时间编程 1.核心理论 (1).时间类型 2.函数学习 (1).获取日历时间 函数名:time 函数原型:time_t time(time_t *t) 函数功能:获取当前日历时间 所属头文件:&l ...

  5. Android:Xml(读取与存储)

    1.读取XML文件 参数xml是建含xml数据的输入流,List<Person> persons用于存储xml流中的数据. XmlPullParser类的几个方法:next(),nextT ...

  6. (Android)View.getHeight或getWidth为0时的一些解决方案

    在Android开发过程中,经常需要动态的更改View的大小,有些View的大小可能需要根据其他View的大小来设定,或者你需要得到一些View的大小来进行某项操作,但是有可能你需要在onCreate ...

  7. jquery学习--选择器

    选择器:basic $('button') html 标签 $('#test') 标签ID $('.test') 标签的class $('.test,#test,h1') 多选用逗号隔开 $('*') ...

  8. 【转】Log4.NET mark

    C#通过log4net进行异常记录 C#中异常的记录也有一个模板,就是log4net.多的就不说了直接看怎么用的吧. 1.引用log4net.dll. 2.实现log4net的方法. public c ...

  9. bzoj3315:[Usaco2013 Nov]Pogo-Cow

    思路:首先可以写出n^3dp的状态转移方程:f[i][j]=max{f[j][k]+val[i]},f[i][j]表示最后一步跳到点从j点跳到i点的最大价值(状态不能设成f[i],因为j对后面的决策是 ...

  10. excl剔除不合格数据求平均值

    excl剔除不合格数据求平均值 trimmean函数 正态分布: CONFIDENCE.NORM 函数