有人能告诉我如何生成所有可能的数字组合吗?例如,如果我有arrayOfNumbers = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;
我需要生成尽可能多的六位数组合。
这些组合与我1,2,3,4,5,6 == 1,3,2,5,4,6;
我想出了一些非常简单的代码,但我想让这段代码更好。我可以在不声明maximumPossibilities
的情况下以某种方式这样做吗?总数有时可能不同,可以是1到48; countOfNumbersForPlay
可能不同,从6到11;
+ (NSArray *)generateNumbers{
int MAX_POSSIBILITIES = 7;
int COUNT_OF_NUMS_FOR_PLAY = 6;
NSMutableArray *results = [NSMutableArray array];
NSArray *numbers = [NSArray arrayWithObjects:[NSNumber numberWithInt:1], [NSNumber numberWithInt:2], [NSNumber numberWithInt:3], [NSNumber numberWithInt:4], [NSNumber numberWithInt:5], [NSNumber numberWithInt:6], [NSNumber numberWithInt:7], nil];
int i = 0;
do {
int x = 0;
NSMutableArray *temp = [NSMutableArray array];
do {
int randomIndex = rand() % numbers.count;
if (![temp containsObject:[numbers objectAtIndex:randomIndex]]) {
[temp addObject:[numbers objectAtIndex:randomIndex]];
x++;
}
} while (x < COUNT_OF_NUMS_FOR_PLAY);
NSArray *sortedArray = [temp sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
if ([obj1 intValue] < [obj2 intValue]) {
return NSOrderedAscending;
} else if ([obj1 intValue] > [obj2 intValue]) {
return NSOrderedDescending;
} else {
return NSOrderedSame;
}
}];
if (![results containsObject:sortedArray]) {
[results addObject:sortedArray];
i++;
}
} while (i < MAX_POSSIBILITIES);
return results;
}
答案 0 :(得分:0)
如果您只是从012345计算到456789,您将通过所有可能的数字0..9组合。根据您的规则,任何前面的数字等于或大于后一个数字(例如,103456)的数字已经“覆盖”,因此您可以跳过,例如,计数中的200000到234567。
从那里推广任意“数字”是一件相当简单的事情。创建一个数组来保存“数字”。每个数组元素都是一个“数字”。然后你需要实现增量规则(就像普通的算术一样),当一个数字增加超过它的上限时,它会被重置为它的下限,而“carry”会使下一个更高阶的数字递增。但请注意,当您以这种方式递增时,当前数字的新值将不可避免地小于您刚刚向左递增的数字(除非它也增加到超过其上限),因此您必须设置当前数字数字到左边的数字+ 1,右边的数字设置为当前数字后增加的值。
每个增量的结果是要生成的值之一。
答案 1 :(得分:0)
尽管Daniel在上面给出了类似的解决方案,但我想用这种方式来表达它,因为这是我在概念上看待这类问题的方式。
假设你有一个名为alpha
的字符的“字母”,比如说这个例子的alpha = {1,2,3,4,5,6}。在这种情况下,字母表的长度是6。
您了解您将使用此字母表生成6 ^ k个有效k长度数字。由于您确保所有角色都是唯一的,因此只能检查
基本上对于[0..6 ^ k]中的所有i,只需将i转换为基数为6.如果你有一个非数字字母,你现在可以将每个字符翻译成它的字母索引。