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

如何根据子数组BX的变更重排并更新原数组A?

问题描述

现有两个数组A和B,A包含B的全部元素及其他额外元素。当B变更为BX时,需按照以下规则将A更新为AX:

  • 保留A中所有不属于B的元素,且保持它们的原有顺序;
  • 若B新增元素,这些元素会被添加至BX的末尾,同时需紧跟A中原B的最后一个元素加入AX;
  • 若B中元素互换位置,A中对应的元素也需同步互换位置;
  • 若同时进行元素新增与多次换位操作,AX需符合上述三条规则。

需要编写一个接收A、B、BX三个参数的函数,返回更新后的数组AX。初始A和B如下:

B = [b1, b2, b3]                A = [a1, a2, b1, a3, b2, b3, a4]

示例

BX = [b3, b2, b1], then         AX = [a1, a2, b3, a3, b2, b1, a4]
BX = [b3, b1, b2], then         AX = [a1, a2, b3, a3, b1, b2, a4]
BX = [b1, b2, b3, b4, b5], then AX = [a1, a2, b1, a3, b2, b3, b4, b5, a4]
BX = [b3, b1, b2, b4, b5], then AX = [a1, a2, b3, a3, b1, b2, b4, b5, a4]
BX = [b4, b3, b1, b2, b5], then AX = [a1, a2, b4, b3, a3, b1, b2, b5, a4]
BX = [b4, b3, b1, b5, b2], then AX = [a1, a2, b4, b3, a3, b1, b5, b2, a4]
实现方案

核心思路

  1. 拆分A中的元素:分离出不属于B的元素(保留原顺序),同时记录原B元素在A中的位置索引,用于后续插入定位;
  2. 统计原B元素在A中的出现次数;
  3. 构建新的B类元素序列:先按BX的顺序,将原B元素按统计次数加入序列;再把BX中新增的元素追加到序列末尾;
  4. 将非B元素按照原位置插入到新的B类元素序列中,得到最终的AX。

代码实现(Python)

def update_A(A, B, BX):
    # 分离非B元素,记录原B元素的插入位置标记
    non_B_elements = []
    b_pos_markers = []
    b_elements_in_A = []
    
    for idx, elem in enumerate(A):
        if elem in B:
            b_elements_in_A.append(elem)
            # 标记该B元素在混合序列中的插入位置(相对于已收集的非B元素数量)
            b_pos_markers.append(len(non_B_elements))
        else:
            non_B_elements.append(elem)
    
    # 统计原B元素在A中的出现次数
    from collections import defaultdict
    b_count = defaultdict(int)
    for elem in b_elements_in_A:
        b_count[elem] += 1
    
    # 构建新的B类元素序列
    new_b_sequence = []
    # 先处理原B元素,按BX顺序添加对应次数的元素
    for elem in BX:
        if elem in b_count and b_count[elem] > 0:
            new_b_sequence.extend([elem] * b_count[elem])
            b_count[elem] = 0  # 避免重复添加
    # 追加BX中的新增元素
    new_elements = [elem for elem in BX if elem not in B]
    new_b_sequence.extend(new_elements)
    
    # 合并非B元素与新B序列,还原原位置结构
    AX = []
    non_b_idx = 0
    b_idx = 0
    
    # 遍历所有位置标记,依次插入元素
    for pos in b_pos_markers + [len(new_b_sequence)]:
        # 插入当前位置前的非B元素
        while non_b_idx < pos:
            AX.append(non_B_elements[non_b_idx])
            non_b_idx += 1
        # 插入当前B元素(如果还有剩余)
        if b_idx < len(new_b_sequence):
            AX.append(new_b_sequence[b_idx])
            b_idx += 1
    
    # 处理剩余的非B元素
    while non_b_idx < len(non_B_elements):
        AX.append(non_B_elements[non_b_idx])
        non_b_idx += 1
    
    return AX

验证示例

以示例5为例测试:

A = ['a1', 'a2', 'b1', 'a3', 'b2', 'b3', 'a4']
B = ['b1', 'b2', 'b3']
BX = ['b4', 'b3', 'b1', 'b2', 'b5']
print(update_A(A, B, BX))
# 输出:['a1', 'a2', 'b4', 'b3', 'a3', 'b1', 'b2', 'b5', 'a4'],与示例结果一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:04:49