【问题标题】:get next element in n-dimensional array获取n维数组中的下一个元素
【发布时间】:2015-07-07 01:14:57
【问题描述】:

我收到了一个我无法解决的面试问题。我觉得解决方案是递归的,但即使那样我也无法理清逻辑。问题如下

给定嵌套数组,编写一个枚举器类,使得 next() 按顺序返回元素,例如:

所以如果输入是:[1,[4,3],6,[5,[1,0]]] 输出为:1, 4, 3, 6, 5, 1, 0

我应该在 Objective-C 中做这件事,而我的(糟糕的解决方案)是

- (void) getNext(NSArray *) array {

  while(!array.isEmpty)
    getNext(array objectAtIndex(first);
}

NSLog(@"object is %@", [array objectAtIndex[0]]);

有人有什么想法吗?我也会接受一个非客观的 C 答案只是为了看看逻辑

【问题讨论】:

  • 我会使用一个堆栈,其元素会跟踪当前“打开”数组中的当前位置;栈顶是当前数组。每次下一个元素变成一个新数组时,您将一个包含对它的引用和索引(最初为 0)的元素压入此堆栈;每次到达当前数组的末尾时,都会弹出堆栈并重新尝试读取“父”数组。否则,只需抓取当前数组中的当前元素,并增加其索引。
  • 至少需要检查数组中的每一项是数字还是子数组。这可以通过isKindOfClassisMemberOfClass 完成。 (我永远不记得该使用哪一个。)然后你进入整个 class cluster foo bar,这可能是面试官在测试你的地方。
  • 我认为,问题在于该函数没有从哪个元素获取它应该返回下一个元素。

标签: objective-c arrays algorithm multidimensional-array


【解决方案1】:

我创建了一个NSArray 类别。

@interface NSArray(EXT)
@property (nonatomic, assign) NSNumber *index;
- (NSNumber *)next;
@end

static void *aIndex = &aIndex;
@implementation NSArray (EXT)
    - (NSNumber *)index {
    return objc_getAssociatedObject(self, aIndex);
}

- (void)setIndex:(NSNumber *)index {
    objc_setAssociatedObject(self, aIndex, index, OBJC_ASSOCIATION_ASSIGN);
}

- (NSNumber *)next {
    if(self.index.integerValue == self.count) {
        return nil;
    }
    else {
        id nextObj = [self objectAtIndex:self.index.integerValue];
        if([nextObj isKindOfClass:[NSNumber class]]) {
            self.index = @(self.index.integerValue+1);
            return nextObj;
        }
        else {
            id childNext = [(NSArray *)nextObj next];
            if(childNext == nil) {
                self.index = @(self.index.integerValue+1);
                return [self next];
            }
            else {
                return childNext;
            }
        }
    }
}
@end

你可以像下面这样使用它:

NSArray *input = @[@1, @[@4, @3], @6, @[@5, @[@1, @0]]];

NSNumber *next = [input next];
while (next != nil) {
    NSLog(@"%@", next);
    next = [input next];
}

【讨论】:

    【解决方案2】:

    解决这个问题的简单方法是

    @interface ViewController ()
    
    @property (nonatomic, strong) NSMutableArray *finalArray;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        NSArray *input = @[@1, @[@4, @3], @6, @[@5, @[@1, @0]]];
        _finalArray = [NSMutableArray array];
    
        [self arrayToString:input];
    
        NSLog(@"Final array %@", [self.finalArray componentsJoinedByString:@","]);
    }
    
    
    - (void)arrayToString: (NSArray *) array {
        for (int i = 0; i < [array count]; i++) {
            [self recurseValue:[array objectAtIndex:i]];
        }
    
    
    }
    
    
    - (void)recurseValue:(id)value {
        if ([value isKindOfClass:[NSNumber class]]) {
            [self.finalArray addObject:value];
        } else if ([value isKindOfClass:[NSArray class]]) {
            for (int i = 0; i< [value count]; i++) {
                [self recurseValue:[value objectAtIndex:i]];
            }
        }
    }
    

    输出:1,4,3,6,5,1,0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 2011-07-08
      • 2020-12-20
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      相关资源
      最近更新 更多