【问题标题】:Algorithm to Generate number letter combinations with a twist生成带有扭曲的数字字母组合的算法
【发布时间】:2016-06-01 22:44:37
【问题描述】:

我必须生成一个长度为 3 的数字和字母的所有可能组合的列表。关键是前两个字符可以是字母或数字,第三个只能是数字。

例如:

AA1, AA2, AA3 .... FC7 ... 001, 002 ... 365)

希望大家能帮帮我。我期待着这些回应。问候,乔希。

到目前为止,我只管理了一种非常简单的方法来获取所有带有普遍零的数字

for ($k = 0 ; $k < 999; $k++) {
     $rnd[] = sprintf('%03d',$k);
}

【问题讨论】:

  • 你试过了吗?
  • 那么,你尝试了什么?
  • 编辑了我到目前为止所获得的内容..
  • 您是否尝试过嵌套多个 for 循环,每个 for 循环都给出其中一个字符的值?
  • 感谢@ErikDolor 的建议我现在已经发布了我的答案:)

标签: php algorithm combinations letters-and-numbers


【解决方案1】:

这应该适合你:

基本上我有一个包含所有字母的数组 ([A-Z]) 和一个包含所有数字的数组 ([0-9])。然后你定义你想要的可能字符的顺序。例如。在这里你想要letterNumberletterNumber,然后只有第三个位置number

在此之后,您循环遍历所有内容的次数与您想要的每个组合的字符数一样多(例如XXX -&gt; 3 times)。在循环中,您将遍历您已经拥有的所有组合以及您想要的所有字符。


因此,在第 1 次迭代之后,您将拥有一个包含每个组合的第一个字符的数组,即:[0-9A-Z]

然后在第二次迭代中,您将检查您已经拥有的所有组合,这里是 [0-9A-Z] 以及您想要在第二个位置出现的字符,这里是 [0-9A-Z]。因此,对于组合数组 ([0-9A-Z]) 中的任何字符,您都会得到一个新组合,其中每个字符为 [0-9A-Z]

这会一遍又一遍地重复,直到获得预期的组合长度。

所以最后你会得到:

letterNumber = 36 = 26 + 10 possible characters ([A-Z0-9])
letter = 26 possible characters ([A-Z])
number = 10 possible characters ([0-9])

36 * 36 * 10 = 12'960 种组合

代码:

<?php

    $letters = range("A", "Z");
    $numbers = array_merge(range(0, 9));
    $order = ["letterNumber", "letterNumber", "number"]; //possibilities: "letter", "number", "letterNumber"

    $length = count($order);
    $combinations = [[]];



    for($count = 0; $count < $length; $count++) {
        $tmp = [];

        if($order[$count] == "number" || $order[$count] == "letterNumber") {
            foreach($combinations as $combination) {
                foreach($numbers as $v)
                    $tmp[] = array_merge($combination, [$v]);
            } 
        }
        if($order[$count] == "letter" || $order[$count] == "letterNumber") {
            foreach($combinations as $combination) {
                foreach($letters as $v)
                    $tmp[] = array_merge($combination, [$v]);
            }
        }

        $combinations = $tmp;

    }

    print_r($combinations);

?>

输出:

Array
(
    [0] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 0
        )

    [1] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 1
        )
    //...


    [12959] => Array
        (
            [0] => Z
            [1] => Z
            [2] => 9
        )

)

Demo

【讨论】:

  • 感谢您的回答,但正如我在上面发布的那样,我确实找到了一个解决方案。无论如何,谢谢:) 非常感谢。我将您的答案标记为正确答案,因为它提供了良好的信息并且使用良好的变量名称更容易理解。
  • @jburley89 更新了我的答案;里面有几个错别字,只把字母改成了大写字母。
【解决方案2】:

以下代码非常适合我所追求的。

$letters = range('A', 'Z');
$comb = array();
for ($k = 0 ; $k <= 9; $k++) {
    foreach($letters as $l){
        foreach($letters as $le){
            $comb[]= $l.$le.$k;
        }
    }
}
for ($k = 0 ; $k <= 999; $k++) {
    $comb[] = sprintf('%03d',$k);
}

【讨论】:

  • 您的解决方案不完整。您缺少 5000 个结果,例如查找 C49。您可以丢弃最后一个循环(使用sprintf 的循环),您必须扩大范围:$letters = array_merge( range('A', 'Z'), range(0, 9) );
  • @insertusernamehere 他缺少 5'200 个组合,大约是所有组合的一半 (12'960) :)
  • 同意这里有很多遗漏。感谢您指出了这一点。我已接受正确答案。
  • @Rizier123 哈哈,我没有做实际的数学 - 这只是一个粗略的估计。不过还是很近的。 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多