LeetCode之合并两个有序数组——JavaScript实现

合并两个有序数组

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

  • 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

输入:
 nums1 = [1,2,3,0,0,0],  m = 3
 nums2 = [2,5,6],    n = 3
输出:
 [1,2,2,3,5,6]

我的想法
将两个数组先合并,然后排序去零即可

遇到的坑
一开始想用es6的展开语法...来合并两个数组,发现不符合题意,题目意思是要用能改变原数组的方法。
题意:

  • @return {void} Do not return anything, modify nums1 in-place instead.

回去看了下文档,...不改变原来的数组,如果对...的具体说明感兴趣可以看文章末尾。

代码

const merge = function (nums1, m, nums2, n) {
    for (let i = 0; i < n; i++) {
        nums1[m + i] = nums2[i]
    }
    nums1 = nums1.sort(sortNum)
    while (nums1[0] == 0 && nums1.length > m + n) {
        nums1.shift()
    }
    return nums1
}

leetcode上最快的解法

思路
先去零再遍历nums2数组合并

函数说明
splice()

  • splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。
    会修改原数组。

slice()

  • slice() 方法返回一个新的数组对象,这一对象是一个由 begin和 end(不包括end)决定的原数组的浅拷贝。
    slice返回制定范围内的数组

findIndex()

  • 遍历数组,参数是一个函数,遍历到当前值,如果当前值符合函数条件的返回这个值的索引。

代码实现:

var merge = function(nums1, m, nums2, n) {
    nums1.splice(m, nums1.length-m)
    nums2.slice(0, n).forEach(value => {
        const index = nums1.findIndex(num => num > value);
        if(index < 0){
          nums1.splice(nums1.length, 0, value)
        } else {
          nums1.splice(index, 0, value)
        }
    });
};

...es6展开符

你可能感兴趣的:(LeetCode之合并两个有序数组——JavaScript实现)