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

两数组对象混合多步单向交换算法求助

算法思路参考

嘿,我来帮你梳理下这个算法问题的思路~首先得把问题的核心规则抠清楚,这是解决问题的关键:

  • 原数组1的元素(比如你的A、B、C)只能往右移动,而且每一步最多挪1个位置
  • 原数组2的元素(比如你的1、2、3)只能往左移动,同样每一步最多挪1个位置
  • 只有当「左边是原数组1的元素,右边是原数组2的元素」时,才能交换——因为交换后两边都朝着允许的方向移动,符合规则

接下来给你两个可行的思路,都不需要写代码,你可以参考着调整逻辑:


思路1:从右往左遍历数组

这个方法能天然避免同一个元素在一步里多次移动,操作起来很直观:

  1. 每一步都从数组的最后一个元素开始,往左挨个检查到第二个元素(因为要对比当前元素和它左边的元素)
  2. 碰到「左边是原数组1的元素,右边是原数组2的元素」的组合,就交换它们;碰到其他情况就继续往左走
  3. 重复这个步骤,直到走完指定的步数

为啥这个方法管用?因为从右往左走,交换过的元素不会被回头再处理,比如原数组2的元素往左挪一次后,我们已经继续往左检查其他元素了,不会让它再挪第二次;原数组1的元素往右挪一次后,也不会被再次处理,完美符合每步只能挪一次的规则。


思路2:从左往右遍历+标记已移动元素

如果你更习惯从左往右看,可以给每个元素加个“已移动”的标记,防止同一元素在一步里多次交换:

  1. 每一步开始时,先准备一个和合并数组一样长的标记列表,初始全是“未移动”状态
  2. 从数组第一个元素开始,往右挨个检查到倒数第二个元素:
    • 要是当前元素是原数组1的,右边是原数组2的,而且两个元素都没被标记过“已移动”,就交换它们
    • 交换后,把这两个元素标记成“已移动”,这样后续遍历就不会再动它们了
  3. 重复这个步骤到指定步数即可

你的现有代码问题在哪?

你的代码有两个核心问题导致只能处理半数步数:

  1. 没限制交换方向:只要相邻元素类型不同就交换,哪怕是「原数组2的元素在左,原数组1的在右」的情况——这会让原数组2的元素往右挪、原数组1的往左挪,直接违反了“只能朝一个方向移动”的规则
  2. 可能让元素多次移动:虽然你交换后会j++跳过下一个索引,但碰到连续的符合条件的组合时,还是可能让同一个元素在一步里挪多次,打乱了每步的节奏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:07:51