我第二天为此奋斗... 我有一个NSArray的整数,包裹为NSNumbers。我需要找到最低的正int,这在数组中不存在。
答案 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)
我将所有内容提取到一个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;