检查生成数字组合的代码

时间:2011-11-10 19:30:29

标签: objective-c algorithm combinations

有人能告诉我如何生成所有可能的数字组合吗?例如,如果我有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;
}

2 个答案:

答案 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.如果你有一个非数字字母,你现在可以将每个字符翻译成它的字母索引。