如何根据子数组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]
实现方案
核心思路
- 拆分A中的元素:分离出不属于B的元素(保留原顺序),同时记录原B元素在A中的位置索引,用于后续插入定位;
- 统计原B元素在A中的出现次数;
- 构建新的B类元素序列:先按BX的顺序,将原B元素按统计次数加入序列;再把BX中新增的元素追加到序列末尾;
- 将非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
相关产品推荐
相关产品推荐

