如何按指定规则分布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
相关产品推荐
相关产品推荐

