问答

前端面试算法题,选马问题,面试没成功。请问我写的有什么问题,

作者:admin 2021-09-06 我要评论

第一题:选马问题 题目描述: 有两组马 A 和 B,每一组都有若干匹马。假设所有的马跑的速度都是匀速, 请从两组马中选出跑步速度最接近的两匹马。输入数组 A 和 ...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

第一题:选马问题

题目描述:

有两组马 A 和 B,每一组都有若干匹马。假设所有的马跑的速度都是匀速, 请从两组马中选出跑步速度最接近的两匹马。输入数组 A 和 B,其中 A[i]和 B[j]分别是 A 组第 i 匹和 B 组第 j 匹的速度。输出速度差最小的两匹马之间的速度差值。

例如 A = { 1, 3, 5, 7, 10 }, B = { 2, 3, 6, 9 }, 则输出为 0。

输入:

第一行第 1 个数为 A 组的马的数量 n,后面有 n 个数表示每匹马的速度。

第二行第 1 个数为 B 组的马的数量 m,后面有 m 个数表示每匹马的速度。

每行数字用空格分割。

马的速度为大于 0 小于 2147483647 的整数

输出

输出最小值

样例输入

5 1 7 5 3 10

4 2 9 6 3

样例输出

0

提示

要求程序时间和空间复杂度尽可能低。暴力O(mn)的方法会视为错误

样例程序

function select(A, B) {

// A = [5, 1, 7, 5, 3, 10]

// B = [4, 2, 9, 6, 3]

实现算法

return answer;

}

我的答案

function select(A, B) {
    let arrA = A;
    let arrB = B;
    let resultCompared = [];
    arrA = new Set(A);
    arrB = new Set(B);
    let flagCompared = false;
    arrA.forEach((item, index)=>{
        if(arrB.has(item)){
            // console.log('邮箱等');
            resultCompared = 0;
            // break;
            flagCompared = true;
        }
    });

    if(flagCompared) {
        return resultCompared;
    } else {
        arrA = Array.from(arrA);
        arrB = Array.from(arrB);
        arrA.forEach((itemA, indexA)=>{
            arrB.forEach((itemB, indexB)=>{
                // console.log('indexA+indexB === ', indexA*arrB.length+indexB);
                let resultAB = itemB - itemA;
                if(resultAB < 0) resultAB = resultAB * -1
                resultCompared[indexA*arrB.length+indexB] = resultAB;
            })
        })

        resultCompared = Array.from(new Set(resultCompared));
        let min = 0;
        resultCompared.forEach((item, index)=> {
            if(index === 0) {
                min = item
            } else {
                if(min>item) min = item;
            }
        })
        
        return min;
    }
}

// let A = [5, 1, 10, 1, 10];
// let B = [4, 2, 9, 6, 8];

let A = [5, 1, 7, 5, 3, 10];
let B = [4, 2, 9, 6, 3];
let result = select(A, B);
###

一个想法:
遍历两个数组,得到一个新数组:

const comArr = []
arrA.forEach(i => comArr[i] = 'a')
arrB.forEach(i => {
    if (comArr[i] === 'a') return 0
    else comArr[i] = 'b'
})

如果没有相同速度的马,就得到了一个 [,a,b,a,b,b,,,b,a,,,,a] 的数组
然后根据 entries 遍历一次找最小间距,超过已知最小值还可以跳过

###

题主好,我是《了不起的JavaScript工程师》的作者亚里士朱德。
思考了一下,觉得可以用排序+双指针实现,如有不对之处欢迎指正。

1.先分别使用sort函数对数组进行排序。
V8采用Timsort算法
时间复杂度为: O(nlogn)
空间复杂度为: O(n)

2.然后用双指针进行遍历比对,找到最小值。
循环数组复杂度为: O(n)
空间复杂度为: O(1)

所以总体复杂度 max{O(mlogm),O(nlogn)},小于O(m*n)。

function select(A, B) {
  let answer = Infinity;
  A.sort((a, b) => a - b);
  B.sort((a, b) => a - b);
  let idxA = 0;
  let idxB = 0;
  while(idxA<A.length && idxB<B.length) {
    answer = Math.min(answer, Math.abs(A[idxA] - B[idxB]))
    if(answer===0) break;
    A[idxA] < B[idxB] ? idxA++ : idxB++;
  }
  return answer;
}
let A = [5, 1, 7, 5, 3, 10]
let B = [4, 2, 9, 6, 3]
select(A, B)

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 前端面试算法题,选马问题,面试没成功

    前端面试算法题,选马问题,面试没成功

  • 仅可输入中英文,不可混合输入,中文最

    仅可输入中英文,不可混合输入,中文最

  • 请问如何通过API调用json数据并通过htm

    请问如何通过API调用json数据并通过htm

  • 请问下react使用map遍历是后面使用大括

    请问下react使用map遍历是后面使用大括

腾讯云代理商
海外云服务器