当前位置:首页 > PHP

PHP实现数字排列

2026-02-15 22:48:31PHP

数字排列的基本概念

数字排列指将一组数字按照特定顺序重新组合,常见于算法题或实际开发需求中。PHP提供了多种方式实现数字排列,包括递归、迭代以及内置函数组合。

使用递归实现全排列

递归是解决排列问题的经典方法,通过不断缩小问题规模生成所有可能的排列组合。

function permute($nums) {
    $result = [];
    $used = array_fill(0, count($nums), false);
    backtrack($nums, [], $used, $result);
    return $result;
}

function backtrack($nums, $current, &$used, &$result) {
    if (count($current) === count($nums)) {
        $result[] = $current;
        return;
    }
    for ($i = 0; $i < count($nums); $i++) {
        if (!$used[$i]) {
            $used[$i] = true;
            $current[] = $nums[$i];
            backtrack($nums, $current, $used, $result);
            array_pop($current);
            $used[$i] = false;
        }
    }
}

// 示例调用
$arr = [1, 2, 3];
print_r(permute($arr));

使用内置函数生成排列

PHP的array_permutations函数(需自定义或通过库实现)可简化操作,但标准库未直接提供此功能。可通过以下方式模拟:

function array_permutations($items) {
    if (count($items) <= 1) {
        return [$items];
    }
    $perms = [];
    foreach ($items as $i => $item) {
        $remaining = $items;
        array_splice($remaining, $i, 1);
        foreach (array_permutations($remaining) as $permutation) {
            $perms[] = array_merge([$item], $permutation);
        }
    }
    return $perms;
}

迭代法实现排列

通过堆栈模拟递归过程,避免递归深度限制问题:

function iterativePermute($nums) {
    $stack = [[$nums, []]];
    $result = [];
    while (!empty($stack)) {
        list($remaining, $current) = array_pop($stack);
        if (empty($remaining)) {
            $result[] = $current;
        } else {
            foreach ($remaining as $i => $num) {
                $newRemaining = $remaining;
                array_splice($newRemaining, $i, 1);
                $stack[] = [$newRemaining, array_merge($current, [$num])];
            }
        }
    }
    return $result;
}

处理重复数字的排列

若输入包含重复数字(如[1,1,2]),需去重:

PHP实现数字排列

function permuteUnique($nums) {
    sort($nums);
    $result = [];
    backtrackUnique($nums, [], array_fill(0, count($nums), false), $result);
    return $result;
}

function backtrackUnique($nums, $current, $used, &$result) {
    if (count($current) === count($nums)) {
        $result[] = $current;
        return;
    }
    for ($i = 0; $i < count($nums); $i++) {
        if ($used[$i] || ($i > 0 && $nums[$i] === $nums[$i - 1] && !$used[$i - 1])) {
            continue;
        }
        $used[$i] = true;
        $current[] = $nums[$i];
        backtrackUnique($nums, $current, $used, $result);
        array_pop($current);
        $used[$i] = false;
    }
}

性能优化建议

  • 对于大规模数据,递归可能导致栈溢出,优先选择迭代法。
  • 使用yield生成器逐步返回结果,减少内存占用:
    function permuteGenerator($nums) {
      if (count($nums) <= 1) {
          yield $nums;
      } else {
          foreach ($nums as $i => $num) {
              $remaining = array_merge(array_slice($nums, 0, $i), array_slice($nums, $i + 1));
              foreach (permuteGenerator($remaining) as $permutation) {
                  yield array_merge([$num], $permutation);
              }
          }
      }
    }

标签: 排列数字
分享给朋友:

相关文章

vue实现倒叙排列

vue实现倒叙排列

在Vue中实现倒序排列 使用v-for指令结合计算属性或数组的reverse()方法可以轻松实现倒序排列。 <template> <div> <ul>…

vue实现倒序排列

vue实现倒序排列

实现数组倒序排列 在Vue中实现数组倒序排列可以通过以下几种方式: 使用JavaScript原生方法 // 假设有一个数组 const originalArray = [1, 2, 3, 4, 5…

vue实现数字递增滚动

vue实现数字递增滚动

Vue 实现数字递增滚动效果 在 Vue 中实现数字递增滚动效果可以通过多种方式完成,以下提供两种常见方法: 使用定时器和计算属性 <template> <div>{{…

js数组实现全排列

js数组实现全排列

全排列的概念 全排列是指将一组元素的所有可能的排列方式列举出来。例如,数组 [1, 2, 3] 的全排列包括 [1, 2, 3]、[1, 3, 2]、[2, 1, 3] 等共 6 种排列。 递归方法…

js实现中文数字排序

js实现中文数字排序

中文数字排序实现方法 在JavaScript中实现中文数字排序需要将中文数字转换为阿拉伯数字后再进行比较。以下是具体实现步骤: 创建中文数字映射表 建立中文数字与阿拉伯数字的对应关系,包括单位和零的…

js实现输入框数字加1

js实现输入框数字加1

实现输入框数字加1的方法 方法一:使用HTML和JavaScript实现基础功能 HTML部分创建一个输入框和按钮: <input type="number" id="numberInput…