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

技术问询:实现循环数组重排使所有元素邻居均变更

循环数组非相邻重排问题的解答

嘿,你要解决的这个问题属于循环数组的非相邻重排(Circular Array Non-Adjacent Permutation),更严谨的归类是避免原相邻元素的循环排列(Circular Permutation Avoiding Original Adjacents),同时它也是**禁位排列(Forbidden Position Permutation)**的一个子集——禁止每个元素在排列后与原数组中的直接左右邻居(包括循环首尾的邻居)相邻。

核心解法思路(适用于长度n≥5的数组)

这里给你一个通用的构造方法,能快速生成符合要求的排列:

  • 第一步:把原数组拆分成两个子数组:前ceil(n/2)个元素组成数组A,后floor(n/2)个元素组成数组B。
    比如原数组[1,2,3,4,5],A = [1,2,3],B = [4,5]
  • 第二步:交替从A和B中取元素拼接,A的元素在前,B的元素在后;若n为奇数,最后把A的末尾元素补在最后。
    按上面的例子,拼接后得到[1,4,2,5,3]
  • 第三步:检查首尾元素是否和原数组的循环邻居冲突(比如原数组首尾是1和5,若排列后首尾是3和1,要确认3的原邻居不是1,1的原邻居不是3)。如果有冲突,只需要交换排列的最后两个元素即可(n≥5时,这种调整不会引发新的冲突)。

验证一下上面的例子:每个元素的邻居都和原数组完全不同,完全符合要求。当然你给出的[3,1,4,2,5]也是一种有效排列,这类问题通常有多个解。

为什么数组长度至少为5?

这是因为更短的数组根本不存在合法解:

  • n=2:只有两个元素,循环状态下无论怎么排列,每个元素的邻居都是另一个,和原数组完全一致,不可能满足要求。
  • n=3:循环数组的任何排列,每个元素的邻居还是另外两个元素,和原数组的邻居完全重合,无解。
  • n=4:尝试所有可能的排列后会发现,总会有至少一个元素的邻居和原数组中的邻居重复,不存在符合要求的排列。

只有当n≥5时,才有足够的元素空间来调整位置,避开所有原相邻关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:40:21