You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按指定规则分布PHP数组元素 避免相同值连续相邻

无相邻重复元素的数组重排方案

实现逻辑

首先需要做可行性校验:如果数组中出现次数最多的元素的频次 > 数组总长度的一半向上取整,不存在符合要求的排列。你提供的案例中总长度为8,最高频元素bye共出现3次,3 ≤ ceil(8/2)=4,满足排列条件。
具体实现步骤如下:

  • 统计数组中每个元素的出现频次,按频次从高到低排序
  • 初始化长度与原数组一致的空结果数组,优先从偶数索引(0、2、4…)位置开始填充
  • 先填充频次最高的元素,每填一个位置指针后移2位,偶数位占满后切换到奇数索引(1、3、5…)继续填充
  • 剩余元素按频次从高到低依次按上述规则填充剩余空位即可

代码实现

function rearrangeNoAdjacent(array $arr): array {
    $length = count($arr);
    if ($length <= 1) {
        return $arr;
    }

    // 统计元素出现频次
    $frequency = array_count_values($arr);
    // 按频次降序排序
    arsort($frequency);

    // 边界判断:最高频元素超过阈值无法实现无相邻排列
    $maxFrequency = reset($frequency);
    if ($maxFrequency > ceil($length / 2)) {
        throw new Exception('当前数组无法生成无相邻重复元素的排列');
    }

    $result = array_fill(0, $length, null);
    $currentPos = 0; // 初始从偶数位开始填充

    foreach ($frequency as $value => $count) {
        while ($count > 0) {
            if ($currentPos >= $length) {
                $currentPos = 1; // 偶数位填满后切换到奇数位
            }
            $result[$currentPos] = $value;
            $count--;
            $currentPos += 2;
        }
    }

    return $result;
}

// 测试调用
$originalArr = [0 => "joy", 1 => "boss", 2 => "salt", 3 => "man", 4 => "fish", 5 => "bye", 6 => "bye", 7 => "bye"];
$newArr = rearrangeNoAdjacent($originalArr);
print_r($newArr);

效果说明

该算法可以100%避免相同元素相邻,你提到的目标排列就是符合该算法输出的有效结果之一,完全满足需求。

内容的提问来源于stack exchange,提问作者Felibrain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:30:03