在NSNumber的NSArray中查找最低未使用int的算法

时间:2012-01-12 21:04:03

标签: objective-c arrays int

我第二天为此奋斗... 我有一个NSArray的整数,包裹为NSNumbers。我需要找到最低的正int,这在数组中不存在。

8 个答案:

答案 0 :(得分:1)

试试这段代码:

int lowest = 1; // or zero

for (NSNumber *number in array)
{
    lowest = min ([number intValue], lowest)
}
编辑:我似乎误读了OP

int lowest = 1; // or zero

NSArray *tempArray = [array sortedArrayUsingSelector:@selector(compare:)];

for (NSNumber *number in tempArray)
{
    if ([number intValue] == lowest)
    {
        lowest = [number intValue] + 1;
    }
}

答案 1 :(得分:1)

您可以使用NSMutableIndexSet作为存储一组整数的有效方法。只需迭代数组,将它们填入NSMutableIndexSet,然后当你完成后,你可以走上索引集直到找到一个洞。这是一个例子:

int lowestPositiveIntNotInArray(NSArray *array) {
    NSMutableIndexSet *set = [NSMutableIndexSet indexSet];
    for (NSNumber *num in array) {
        [set addIndex:[num intValue]];
    }
    // assuming 0 is a valid result here
    NSUInteger seed = [set firstIndex];
    if (seed > 0) {
        return 0;
    }
    NSUInteger next;
    while ((next = [set indexGreaterThanIndex:seed]) != NSNotFound) {
        if (next - seed > 1) {
            // there's a hole here
            break;
        }
        seed = next;
    }
    return seed+1;
}

答案 2 :(得分:1)

这是我能想到的“最简单”版本(注意,简单,效率不高等)。

简单地说,循环N次,直到找到未包含的数字。如果你找不到,那么它必须是下一个。

这也假设0被认为是有效答案。

for (int i = 0; i < [numbersArray count]; i++) {
    if (![numbersArray containsObject:[NSNumber numberFromInt:i]]) {
        return i;
    }
}
return [numbersArray count];

答案 3 :(得分:0)

  • 对数组进行排序
  • 走完阵列,直到找到丢失的号码。

这里是否有一些更复杂的要求我缺席了?

答案 4 :(得分:0)

您可以使用quicksort对数组进行排序并先取(或者最后取决于排序是新月还是新月)

答案 5 :(得分:0)

我会做一些事情,比如按顺序排列数字。迭代列表并停止和第一个正数。如果找到的数字 - 1 仍为正数,那么它是最不正数的int或找到的数字本身是最少的。

答案 6 :(得分:0)

也许你可以试试这样的东西?我把它放在单元测试中。如果您不熟悉语法,只需查看for (NSNumber *num in listOfNumbers)循环逻辑。

- (void)testExample {
    // setup
    NSMutableArray *listOfNumbers = [[NSMutableArray alloc]init];
    [listOfNumbers addObject:[[NSNumber alloc]initWithInt:6]];
    [listOfNumbers addObject:[[NSNumber alloc]initWithInt:4]];
    [listOfNumbers addObject:[[NSNumber alloc]initWithInt:12]];
    [listOfNumbers addObject:[[NSNumber alloc]initWithInt:-12]];

    // sort
    [listOfNumbers sortUsingSelector:@selector(compare:)];

    // get the result
    int result = 0;    
    for (NSNumber *num in listOfNumbers) {
        if ([num intValue] > 0 ) {
            result = [num intValue] - 1;
            break;
        }
    }
    STAssertEquals(result, 3, @"Was not 3");
}

您可以执行其他操作,例如添加bool found变量以通知未遇到正数。或者你可以通过读取数组中的最后一个值进行优化 - 如果它是负数,那么数组中的所有值都是负数。

答案 7 :(得分:0)

我正在寻找一个全面且代码较少的答案。我使用@Richard J.Ross III,@ MarkPowell和@Kevin Ballard的建议编写了一个解决方案,谢谢你们。

我将所有内容提取到一个NSMutableIndexSet中,它具有一个方便的功能 - 它总是排序,因此我们不需要sortDescriptor。之后,我宣布一个可接受的最低数字。这很方便,因为这样我可以排除0.然后,我迭代集合,直到找到一个&#34;洞&#34;在里面。 我使用WHILE循环,对我来说,它是常识的最佳近似,即while :)有一个数字匹配我的int,提高我的int并再试一次。如果不再匹配,则新的最低值是正确的。

NSMutableIndexSet *mutableSetOfIDs = [[NSMutableIndexSet alloc] init];

    for (Item *item in itemDatabase) 
    {
        NSUInteger x = item.ID;
        [mutableSetOfIDs addIndex:x];
    }


int lowest = 1;

    while ([mutableSetOfIDs containsIndex:lowest]) 
    {
        lowest++;
    }
    return lowest;