我对Objective-C语言很陌生,在面试中我被问到一个我无法回答的问题。
我尝试了很多方法和逻辑但没有成功。在这里寻找答案:
问题是:
- (NSArray *)reorderTheArraysAndMergeThemInDescendingOrder:(NSArray *)firstArray and:(NSArray *)secondArray
参数中提供的数组都已按升序排序。
我的任务是提供一个数组作为返回变量,它将包含firstArray和secondArray的所有唯一元素,并将按降序排列。我不被允许使用Objective-C的内置排序功能(这是我在这个领域以来一直这样做的方式)。我的变量可能只是基元(当然结果将是整数数组。)。
我是整个编程场景的新手,在这里一个好的答案将非常感谢。
Shukaku
答案 0 :(得分:5)
由于提供的数组按升序排序,这个问题与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:
中使用,这只是为了证明这个想法,而不是为了盒子代码解决方案
答案 1 :(得分:1)
有很多方法可以解决这个问题。您可以反转数组,然后将第二个项目插入到第一个数组中,或者您可以将第二个项目附加到第一个数据中,然后再将它们移动到它们。
我稍后会发布代码,展示我能找到的最简单的方法。它的速度和效率有多快?只要它能完成工作,它能成为什么吗?
编辑: 似乎Olotiarhas打败了我。