两数组对象混合多步单向交换算法求助
算法思路参考
嘿,我来帮你梳理下这个算法问题的思路~首先得把问题的核心规则抠清楚,这是解决问题的关键:
- 原数组1的元素(比如你的A、B、C)只能往右移动,而且每一步最多挪1个位置
- 原数组2的元素(比如你的1、2、3)只能往左移动,同样每一步最多挪1个位置
- 只有当「左边是原数组1的元素,右边是原数组2的元素」时,才能交换——因为交换后两边都朝着允许的方向移动,符合规则
接下来给你两个可行的思路,都不需要写代码,你可以参考着调整逻辑:
思路1:从右往左遍历数组
这个方法能天然避免同一个元素在一步里多次移动,操作起来很直观:
- 每一步都从数组的最后一个元素开始,往左挨个检查到第二个元素(因为要对比当前元素和它左边的元素)
- 碰到「左边是原数组1的元素,右边是原数组2的元素」的组合,就交换它们;碰到其他情况就继续往左走
- 重复这个步骤,直到走完指定的步数
为啥这个方法管用?因为从右往左走,交换过的元素不会被回头再处理,比如原数组2的元素往左挪一次后,我们已经继续往左检查其他元素了,不会让它再挪第二次;原数组1的元素往右挪一次后,也不会被再次处理,完美符合每步只能挪一次的规则。
思路2:从左往右遍历+标记已移动元素
如果你更习惯从左往右看,可以给每个元素加个“已移动”的标记,防止同一元素在一步里多次交换:
- 每一步开始时,先准备一个和合并数组一样长的标记列表,初始全是“未移动”状态
- 从数组第一个元素开始,往右挨个检查到倒数第二个元素:
- 要是当前元素是原数组1的,右边是原数组2的,而且两个元素都没被标记过“已移动”,就交换它们
- 交换后,把这两个元素标记成“已移动”,这样后续遍历就不会再动它们了
- 重复这个步骤到指定步数即可
你的现有代码问题在哪?
你的代码有两个核心问题导致只能处理半数步数:
- 没限制交换方向:只要相邻元素类型不同就交换,哪怕是「原数组2的元素在左,原数组1的在右」的情况——这会让原数组2的元素往右挪、原数组1的往左挪,直接违反了“只能朝一个方向移动”的规则
- 可能让元素多次移动:虽然你交换后会
j++跳过下一个索引,但碰到连续的符合条件的组合时,还是可能让同一个元素在一步里挪多次,打乱了每步的节奏
内容的提问来源于stack exchange,提问作者XXX YYY
相关产品推荐
相关产品推荐

