• 一道简单的IOS面试题-b


    题目:

    (参考:陈曦 包子的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
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 相关阅读:
    深入理解DOM事件类型系列第四篇——剪贴板事件
    深入理解DOM事件机制系列第四篇——事件模拟
    利用select实现年月日三级联动的日期选择效果
    深入理解表单脚本系列第四篇——选择框脚本
    存储过程返回布尔值以及C#相关处理
    Type 'Insus.NET.PictureObject' in Assembly 'App_Code, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
    打开Windows10网络发现或是文件打印共享
    反射(Reflection)的SetValue遇上DBNULL转换为string
    MS SQL中使用UPDATE ... INNER JOIN ...
    Visual Studio 2015正式企业(Enterprise)版
  • 原文地址:https://www.cnblogs.com/isItOk/p/5838246.html
Copyright © 2020-2023  润新知