js数组操作问题

给定一个有序不重复数组arr1 = [a1,a2,....,an] , 一个该数组的子集 arr2 = [b1,b2,....,bn](顺序与arr1 一致)
任意给定一个arr1的元素 ai , 请将其插入 arr2 并保证 顺序与 arr1 的顺序一致

比如 arr1 [3,5,4,8] , arr2 [5,8] 现在要把 4 插入到 arr2
需要结果为 [5, 4, 8]

求一个优雅的运算方法

---------------分割线-------------

我采纳了 @hkuclion 的答案 并作了小小的修改

let source = [3,5,4,8];
let target = [5,8];
let needle = 4;

let source_index = source.indexOf(needle);
if(source_index !== -1){
    let target_index = -1;
    while (source_index && target_index === -1) {
        target_index = target.indexOf(source[--source_index]);
    }
    target.splice(target_index + 1, 0, needle);
}

阅读 2.7k
4 个回答

尝试下面代码

let source = [3,5,4,8];
let target = [5,8];
let needle = 4;

let source_index = source.indexOf(needle);
if(source_index !== -1){
    let target_index = source_index? target.indexOf(source[source_index - 1]) + 1:source_index;
    target.splice(target_index, 0, needle);
}

还是二分 修改一下比较的方式就行

let arr1 = [3,5,4,8] 
let arr2 = [5,8] 
let indexMap = {}
for(let i=0;i<arr1.length;i++){
    indexMap[arr1[i]] = i
}
insert(arr2,0,arr2.length,4)
console.log(JSON.stringify(arr2))

function insert(arr,l,r,num){
    if(l==r){
        arr.splice(l, 0, num)
        return
    }
    let index = parseInt((r+l)/2)
    if(indexMap[arr[index]]<indexMap[num]){
        insert(arr,index+1,r,num)
    }else{
        insert(arr,l,index,num)
    }
}
  let source = [3, 5, 4, 8]
  let target = [5, 8]
  let insert = 4

  let index = source.indexOf(insert)
  for (let i = 0; i < target.length; i++) {
    let source_index = source.indexOf(target[i])
    if (source_index > index) {
      target.splice(i, 0, insert)
      break
    }
  }
  if (target.indexOf(insert) === -1) target.push(insert)

既然是有序的……其实有没有arr1都无所谓的……

有序的,你直接用二分把aiarr2里面塞就行了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题