欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

排列组合问题

程序员文章站 2022-07-11 09:10:52
...

排列组合问题

今天同事问了我一个问题,给定随机几个数字(不重复),列出其所有排列组合可能.
这个问题看似很简单,毕竟排列组合大家都学过,都知道总可能数为n!,可是要想列出所有可能,似乎就没那么轻松了.
经过一个午饭时间的思考,终于想除了一个比较low的解决方法

问题分析

略,有空再补上

代码示例

Talk is cheap, show you my code!

<?php
class Permutation
{
    public $result = [];

    /**
     * 生成排列组合
     * @param array $in_arr 待排数字
     * @param array $out_arr 已排数字
     */
    public function generateArray($in_arr, $out_arr = [])
    {
        $len = count($in_arr);
        if ($len == 1) { // 输入集只有一个,则取完数据
            $this->result[] = array_merge($out_arr, [$in_arr[0]]); // 生成的排列组合储存

        }
        for ($i = 0; $i < $len; $i++) {
            $tem = array_merge($out_arr, [$in_arr[$i]]); // 将取出数字放入结果集
            $this->getArray(unsetI($in_arr, $i), $tem); // 递归取出下一结果集
        }
    }

}

/**
 * 删除索引为i的值且重排索引
 * @param $arr
 * @param $i
 * @return array
 */
function unsetI($arr, $i)
{
    unset($arr[$i]);
    return array_values($arr);
}


/*---------测试代码--------------*/
$class = new Permutation();
$class->generateArray([1, 2, 3, 4]);
echo "总共:" . count($class->result) , PHP_EOL;
pr($class->result);

function pr($arr)
{
    foreach ($arr as $item) {
        foreach ($item as $value) {
            echo $value;
        }
        echo PHP_EOL;
    }
}

输出

总共:24
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321

最后的话

以上代码仅是个人解法,希望诸位能够在评论区列出自己的解法或者思路供笔者参考.

上一篇: 在河边钓鱼

下一篇: 排列组合