【问题标题】:Review of code for generating combinations of numbers审查生成数字组合的代码
【发布时间】:2011-11-10 19:30:28
【问题描述】:

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

【问题讨论】:

  • en.wikipedia.org/wiki/Combination - 这就是你想要的吗?
  • 是的,这正是我所需要的,但我如何在 xcode c++ 中做到这一点?我的解决方案对我来说不够好。
  • 这听起来像是其他人的家庭作业吗?
  • 不,您不必在这里编写确切的代码,我只需要一点帮助,我如何改进我的代码。谢谢

标签: objective-c algorithm combinations


【解决方案1】:

如果您只是从 012345 数到 456789,您将通过数字 0..9 的所有可能组合。根据您的规则,如果前面的数字等于或大于后面的数字(例如 103456),则它已经“覆盖”了,因此您可以从例如 200000 跳到 234567。

从那里推广任意“数字”是一件相当简单的事情。创建一个数组来保存你的“数字”。每个数组元素是一个“数字”。然后你需要实现增量规则(就像普通算术一样),当一个数字增加超过其上限时,它会重置为其下限,并且“进位”会导致下一个高位数字增加。但请注意,当您以这种方式递增时,当前数字的新值将不可避免地小于您刚刚向左递增的数字(除非它也被递增到超过其上限),因此您必须设置当前digit 为左边数字的值 + 1,并将右边的数字设置为在当前数字之后增加值。

每个增量的结果是要生成的值之一。

【讨论】:

    【解决方案2】:

    虽然丹尼尔在上面给出了类似的解决方案,但我想这样表述,因为这是我从概念上看待这类问题的方式。

    假设您有一个名为 alpha 的字符的“字母表”,假设在本例中 alpha = {1,2,3,4,5,6}。在这种情况下,字母的长度是 6。

    您知道您将有 6^k 个有效的 k 长度数字与此字母表。由于您确保所有字符都是唯一的,因此只有真正可以检查

    基本上对于 [0..6^k] 中的所有 i,只需将 i 转换为基数为 6。如果您有一个非数字字母表,您现在可以将每个字符转换为其字母表的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-21
      • 2011-04-01
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多