准备面试。试图找出问题的解决方案"消除阵列连续重复的最快方法"使用Objective-C。即输入= [1,2,2,1,2,3,3,4]输出= [1,2,1,2,3,4]
对于in-array方法:遍历数组中的元素,如果element == previous element,则将其删除并重新调整所有其他元素以向下移动。
我们可以使用另一个数组的方法。如果element == previous element,请不要将其添加到新的" Unique array",否则将其添加到Unique数组。
有没有更好的解决方案?代码如下。可以进行任何优化吗?
使用其他数组
//Pseudocode for sucessive dup elimination when using another array
//
//duplicateLessArray = empty array
//previous element = not set
//
//for (loop through each element in origArray)
// if(previous element == not set or element != previous element)
// set previousElement = element
// add element to duplicateLessArray
//
NSMutableArray *duplicateLessArray ;
duplicateLessArray = [[NSMutableArray alloc] init] ;
for (NSNumber *nextNumber in origArray)
{
if ([nextNumber intValue] != [[duplicateLessArray lastObject] intValue])
{
[duplicateLessArray addObject:nextNumber] ;
}
}
NSLog(@"Duplicate less array = %@",duplicateLessArray) ;
使用相同的数组
//Pseudocode for in array sucessive dup elimination
//
//previous element = not set
//
//for (loop through each element in origArray)
// if(previous element == not set or element != previous element)
// set previousElement = element
// else
// delete it from origArray
// move back all elements by 1
NSInteger numElementsInDupLessArray = 0 ;
NSNumber *prevElement ;
for (NSNumber *nextNumber in [origArray copy])
{
if (numElementsInDupLessArray == 0 || [nextNumber intValue] != [prevElement intValue])
{
prevElement=nextNumber ;
numElementsInDupLessArray++;
}
else
{
[origArray removeObjectAtIndex:numElementsInDupLessArray] ;
}
}
NSLog(@"Duplicate less array = %@",origArray) ;
答案 0 :(得分:2)
阵列内方法有优化:
不是逐个删除元素(这可能导致O(n ^ 2)复杂度)而只是移动单个元素。
伪代码:
numOfRemoved = 0
GoodValue = A[0]
for i = 1 to arrayEnd //note start from 2nd element
if A[i] = GoodValue then
numOfRemoved++
else
GoodValue = A[i]
A[i-numOfRemoved] = A[i]
Resize array once to (Length - numOfRemoved)
示例('表示当前元素,nr是numOfRemoved)
[5 5 1 7 7 7 4] nr = 0 ; 5 stays at index 0
[5 '5 1 7 7 7 4] nr = 0->1
[5 5 '1 7 7 7 4] nr = 1 ; 1 goes to index 2-1 = 1
[5 1 1 '7 7 7 4] nr = 1 ; 7 goes to index 2
[5 1 7 7 '7 7 4] nr = 1->2
[5 1 7 7 7 '7 4] nr = 2->3
[5 1 7 4 7 7 '4] nr = 3 ; 4 goes to index 6-3 = 3
[5 1 7 4] resize