NSArray 方法 算法逻辑

Posted

技术标签:

【中文标题】NSArray 方法 算法逻辑【英文标题】:NSArray Method Algorithm logic 【发布时间】:2012-07-23 06:02:04 【问题描述】:

我是 Objective-C 语言的新手,在面试中被问到一个我无法回答的问题。

我尝试了很多方法和逻辑都没有成功。在这里寻找答案:

问题是:

 - (NSArray *)reorderTheArraysAndMergeThemInDescendingOrder:(NSArray *)firstArray and:(NSArray *)secondArray

参数中提供的两个数组都已按升序排序。

我的任务是提供一个数组作为返回变量,它将包含 firstArray 和 secondArray 的所有唯一元素,并将它们按降序排列。我不被允许使用 Objective-C 的内置排序功能(这是我在这个领域以来一直这样做的方式)。我的变量可能只是原始变量(结果当然是一个整数数组。)。

我完全是整个编程领域的新手,非常感谢这里的好答案。

书阁

【问题讨论】:

对于数组中的唯一元素,请检查:- ***.com/questions/1439564/… 对于按降序排列数组:- ***.com/questions/3402667/… 【参考方案1】:

由于提供的数组是按升序排列的,所以这个问题与Mergesort的经典算法非常相关(如果你没听说过,可以看看它,这是一个经典)。

由于您的数组仅包含原始数据类型,因此可以使用 < 比较它们

你感兴趣的代码看起来像

- (NSArray *)reorderAndMergeReverse:(NSArray *)array1 and:(NSArray *)array2

    NSMutableArray *result = [NSMUtableArray array];

     int i = array1.count-1;
     int j = array2.count-1;

     while (result.count < array1.count+array2.count)

        if ([array1 objectAtIndex:i] > [array2 objectAtIndex:j])
             [result addObject:[array1 objectAtIndex:i]];
             i--:
         else 
            [result addObject:[array2 objectAtIndex:j]];
             j--:
        

     
     return result;

我不确定您是否要删除重复项,您的问题不是很清楚,您是否介意告诉我是否可以改进我的代码? 编辑:还是这样做了:由于您的数组已排序,重复项彼此相邻,因此首先不添加它们可能很容易;

- (NSArray *)reorderAndMergeReverse:(NSArray *)array1 and:(NSArray *)array2

    NSMutableArray *result = [NSMUtableArray array];

     int i = array1.count-1;
     int j = array2.count-1;
     int k = 0;

     while (i>=0 || j>=0)

        if ([array1 objectAtIndex:i] > [array2 objectAtIndex:j])
             if ([array1 objectAtIndex:i] != [result objectAtIndex:k])
                 [result addObject:[array1 objectAtIndex:i]];
                 k++;
             
             i--:
         else 
            if (array2 objectAtIndex:j] != [result objectAtIndex:k])
                   [result addObject:[array2 objectAtIndex:j]];
                   k++;
             
             j--:
        

     
     return result;

编辑:该代码中有一些错误,因为i 可能会变成负数,然后在objectAtIndex: 中使用,这只是为了演示这个想法,而不是提供开箱即用的代码解决方案

【讨论】:

感谢您的回答,我正在从中获取线索。是的,重复的不应该在那里。例如,如果 arrayfirst 有 2,3,4,而 secondArray 有 3,4,5...则结果数组应该是 5,4,3,2。 刚刚编辑了我的帖子以删除重复项(更确切地说,不是一开始就添加它们)【参考方案2】:

有很多方法可以解决这个问题。您可以反转数组,然后将第二个中的项目插入第一个,或者您可以将第二个附加到第一个然后重新使用它们。

稍后我将发布代码来演示我能找到的最简单的方法。它必须有多快和多高效?只要能完成工作,它可以是任何东西吗?

编辑: 看来奥洛蒂亚尔已经打败了我。

【讨论】:

以上是关于NSArray 方法 算法逻辑的主要内容,如果未能解决你的问题,请参考以下文章

NSArray 初始化方法

重写NSArray与NSDictionary的descriptionWithLocale方法

NSArray与NSMutableArray的常用方法

从 NSArray 动态生成 NSPredicate

关于NSArray的方法知识简单了解

NSArray倒序输出的方法