【问题标题】:Return all sets where all of its numbers are not in any other set返回所有数字都不在任何其他集合中的所有集合
【发布时间】:2015-05-06 18:07:12
【问题描述】:

我最近不得不解决以下算法问题,这让我很困惑。

假设您有一个包含整数的集合数组。写一个 返回所有数字都不在任何集合中的所有集合的函数 其他设置。

示例 {0,4,9}、{3,4,5}、{6,7,8}

结果 {6,7,8}

代码应该是 Objective-C 或 Swift。

[编辑]

到目前为止,我想出了类似的东西,但无法真正完成。

- (NSArray*) getDisjointedSets:(NSArray*)sets {
    NSArray* resultedSet;
    NSMutableArray* indexDoesntExistInSets = [NSMutableArray array];
    [sets enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSArray* nextIndexArray = [sets objectAtIndex:idx+1];
        NSNumber* numberIndex = obj;
        [nextIndexArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            NSNumber* numberNextIndex = obj;
            if (numberIndex.intValue == numberNextIndex.intValue) {
               // number exists in the next set, continue

               *stop = YES;;
            } else {
                [indexDoesntExistInSets addObject:numberIndex];
            }
        }];
    }];
    return resultedSet;
}

【问题讨论】:

  • 你有什么问题?你试过什么?你有什么问题?或者你只是想让别人给你代码?
  • 就是上面的问题,我解决不了,所以我在寻找答案来理解它。
  • 发布您的尝试并解释您遇到的问题。
  • 编辑了一些我正在尝试完成的代码。
  • 集合中的数字有限制吗?套数?

标签: objective-c algorithm set


【解决方案1】:

您的代码会迭代数组数组。但是你得到下一个数组,迭代它的数字,但尝试将这些数字中的每一个与当前集合进行比较。

假设您有 NSArrayNSArray 对象,您可以这样做:

- (NSArray *)getDisjointedSets:(NSArray *)sets {
    NSMutableArray *resultSet = [NSMutableArray array];
    for (NSArray *arrayA in sets) {
        BOOL noMatch = YES;
        for (NSArray *arrayB in sets) {
            // Skip if both are the same array
            if (arrayA != arrayB) {
                NSMutableSet *setA = [NSMutableSet setWithArray:arrayA];
                NSSet *setB = [NSSet setWithArray:arrayB];
                [setA intersectSet:setB];
                if (setA.count) {
                    // The two sets have something in common
                    noMatch = NO;
                    break;
                }
            }
        }

        if (noMatch) {
            [resultSet addObject:arrayA];
        }
    }

    return resultSet;
}

测试代码:

NSArray *sets = @[
    @[ @0, @4, @9 ],
    @[ @3, @4, @5 ],
    @[ @6, @7, @8 ]
];
NSArray *result = [self getDisjointedSets:sets];
NSLog(@"results = %@", result);

【讨论】:

  • 效果很好!我错过了将每个集合迭代到 A 集合的关键,如果它是相同的则跳过并使用相交!谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
相关资源
最近更新 更多