js 面试 算法题

x丶yong
  • 59

今天面试,考官给了一道算法题,有数组1和数组2,这两个数组都是已经按照从大到小排好序的,然后求两个数组集合的中间数。给出的思路是:要从已排好顺序的数组1和数组2入手,只需要比较数组1和数组2的第一个元素,然后一直循环下去就可以了。然后我的思路就如下代码,但是最后的temp一直是undefined,打了断点也没看懂,有小伙伴能给解释下吗,谢谢啦

        function test(arr1,arr2){
            var arr=[];
            while(arr1.length>0&&arr2.length>0){
                if(arr1[0]>=arr2[0]){
                    arr.push(arr1[0]);
                    arr1.pop(arr1[0]);
                }else if(arr1[0]<arr2[0]){
                    arr.push(arr2[0]);
                    arr2.pop(arr2[0]);
                }
            }
            var temp;
            if(arr1.length=0){
                temp=arr.concat(arr2);
            }
            if(arr2.length=0){
                temp=arr.concat(arr1);
            }

            return document.write(temp);
        }
评论
阅读 3.1k
5 个回答
✓ 已被采纳

pop() 方法用于删除并返回数组的最后一个元素,应该是删除第一个元素吧。。。。 shift() 才对

楼主去看看归并排序的合并过程吧

function combine(a1, a2) {
    var a3 = []
    var i = 0
    var j = 0
    var k = 0

    while (i < a1.length && j < a2.length) {
        if (a1[i] > a2[j]) {
            a3[k] = a1[i]
            i++
            k++
        } else {
            a3[k] = a2[j]
            j++
            k++
        }
    }

    while (i<a1.length) {
        a3[k] = a1[i]
        i++
        k++
    }

    while (j<a2.length) {
        a3[k] = a2[j]
        j++
        k++
    }

    return a3
}

比较数组1和数组2的第一个元素,这样只能找到最小的数和最大的数,我不明白,怎么可能找到中间的数。

function getCentralNum(arr1, arr2) {
    var arr = arr1.concat(arr2).sort(function(a, b){
        return a-b;
    }),
    // 中间数的索引值
    i = Math.floor((arr.length-1)/2);

    // 区分合并后的数组长度是偶数还是奇数,偶数返回两个值,奇数返回一个值
    return (arr.length%2 == 0) ? [arr[i], arr[i+1]] : arr[i]
}

注:此方法中对参数没有做校验,默认两个参数都是数组且不为空,需要的话可以加上

宣传栏