2020携程旅游前端笔试题

题目1:生成和遍历二叉树

题目描述:

已知有平面坐标系的十组坐标点[[x1,y1], [x2,y2], ……, [x10,y10]],每次找出距离最近的两组坐标进行合并,合并后的坐标取两者平均值,即[(x1+x2)/2 , (y1+y2)/2](如有小数统一向下取整,即2.4取2),合并后的新坐标作为二叉树根节点,原坐标取X值较小的作为左节点,另一个为右节点,假设第一次计算后得出[x1,y1], [x2,y2]距离最近,且x1<x2,则构成如下二叉树:

         [(x1+x2)/2, (y1+y2)/2]

                /   \

               /     \

          [x1, y1]    [x2, y2]       [x3, y3] [x4, y4]  ……[x10, y10]

合并后的新坐标和余下没有在二叉树中的原始坐标构成新数组[[(x1+x2)/2, (y1+y2)/2], [x3,y3],[x4, y4] ……, [x10,y10]]继续重复上述步骤,直至二叉树构建完成,最后按前序优先输出二叉树的数组,假设只有3组坐标的话,可能的一种二叉树场景为:

              [(((x1+x2)/2)+x3]/2, (((y1+y2)/2)+y3]/2]

                             /                  \

                           /                      \

          [(x1+x2)/2, (y1+y2)/2]      [x3,y3]

                /         \

               /           \

          [x1, y1]    [x2, y2]

注:

两点之间距离的平方公式:(x1-x2)²+(y1-y2)²

输入描述

表示平面坐标系中坐标点的二维数组,如int a[10][2]

输出描述

前序遍历后的二叉树数据

样例输入

[[5,10], [3,15], [10,18]]

样例输出

7,15

4,12

3,15

5,10

10,18

解题思路:(AC 25%)

var arr = [
    [5, 10],
    // [3, 15],
    // [10, 18],
];
var root = null;
function Node(value) {
    this.value = value;
    this.left = null;
    this.right = null;
}
// 计算距离最近的两个点,添加两种的中点,删除原来的点
function oneHandle(arr, node) {
    // console.log("***");
    var min = Infinity;
    var newItem = [];
    var delete1 = 0;
    var delete2 = 0;
    for (var i = 0; i < arr.length; i++) {
        for (var j = i + 1; j < arr.length; j++) {
            var dis =
                Math.pow(arr[i][0] - arr[j][0], 2) + Math.pow(arr[i][1] - arr[j][1], 2);
            // console.log(dis);
            if (dis < min) {
                min = dis;
                newItem.push(Math.floor((arr[i][0] + arr[j][0]) / 2));
                newItem.push(Math.floor((arr[i][1] + arr[j][1]) / 2));
                delete1 = i;
                delete2 = j;
            }
        }
    }
    var newNode = new Node(newItem);
    if (!node) {
        if (arr[delete1][0] < arr[delete2][0]) {
            newNode.left = new Node(arr[delete1]);
            newNode.right = new Node(arr[delete2]);
        } else {
            newNode.left = new Node(arr[delete2]);
            newNode.right = new Node(arr[delete1]);
        }
    } else {
        if (node.value[0] == arr[delete1][0]) {
            if (arr[delete1][0] < arr[delete2][0]) {
                newNode.left = node;
                newNode.right = new Node(arr[delete2]);
            } else {
                newNode.left = new Node(arr[delete2]);
                newNode.right = node;
            }
        } else {
            if (arr[delete1][0] < arr[delete2][0]) {
                newNode.left = new Node(arr[delete1]);
                newNode.right = node;
            } else {
                newNode.left = node;
                newNode.right = new Node(arr[delete1]);
            }
        }
    }

    root = newNode;
    arr.splice(delete2, 1);
    arr.splice(delete1, 1);
    arr.push(newItem);
    // console.log(root);
    // console.log(arr);
}

function handle() {
    if (arr.length == 1) {
        root = new Node(arr[0]);
    }
    while (arr.length > 1) {
        oneHandle(arr, root);
        // console.log(arr);
    }
}
handle();
// console.log(root);
function traverse(node) {
    if (!node) return null;
    console.log(node.value.toString());
    traverse(node.left);
    traverse(node.right);
}
traverse(root);

题目2:数组排序+栈

题目描述:

输入一个数组,排除掉非数字类型和负数的元素后,对数组中剩余的元素进行排列组合,求出组合后的最大数值。

输入描述

输入一个数组数组

输出描述

输出这个数组排列的最大值

样例输入

[1,0,2,3]

样例输出

3210

解题思路:(AC 60%)

// var arr = [1, 0, 2, 3, -22, "aa", { name: "99" }, [12, 3]];
var arr = [1];
arr = arr.filter((item) => {
    return item >= 0 && typeof item == "number" && !Number.isNaN(item);
});
arr.sort((a, b) => a - b);
console.log(arr);
var str = "";
while (arr.length > 0) {
    str += arr.pop();
}
console.log(str);

题目3:

题目描述:

携程为庆祝中秋节,举办了中秋晚会,在晚会活动中有一个词语对对碰环节。该环节要求参赛选手两两组队,每队由其中一人A提出词型,另外一人B根据词型给出相匹配的答案,匹配成功进入下一轮。

请帮助主办方设计一个算法识别B给出的答案是否能够匹配A提出的词型。

**要求:**答案只能是纯英文字母,不同单词间以空格分隔,如果输入的内容中含有数字、中文或特殊符号等,直接返回-1。已知判定字符串是否是纯英文字母或空格的正则为:"1+$"

输入描述

输入数据,两个单词之间以空格分隔,举例:

A提出:ABAC词型 B回答:jin sheng jin shi(ABAC),B回答正确,输出1

A提出:ABCD词型 B回答:xiao xin yi yi(ABCC),B回答错误,输出0

A提出:AABC词型 B回答:人 人 you ze(有中文),B回答错误,输出-1

输出描述

回答正确输出1,回答错误输出0,程序异常或回答中有非英文内容,输出-1

样例输入

ABAC

jin sheng jin shi

样例输出

1

解题思路:(AC60%)

var str = "ABAC";
var answer = "人 人 you ze";
function handle(str) {
    if (!/^[A-Za-z ]+$/.test(str)) {
        // console.log(-1);
        return;
    }
    var questionObj = {};
    for (var i = 0; i < str.length; i++) {
        if (questionObj[str[i]]) {
            questionObj[str[i]].push(i);
        } else {
            questionObj[str[i]] = [];
            questionObj[str[i]].push(i);
        }
    }
    var arr = answer.split(" ");
    var answerObj = {};
    for (var i = 0; i < arr.length; i++) {
        if (answerObj[arr[i]]) {
            answerObj[arr[i]].push(i);
        } else {
            answerObj[arr[i]] = [];
            answerObj[arr[i]].push(i);
        }
    }
    // console.log(questionObj);
    // console.log(answerObj);
    var tag = 0;
    var arr1 = [];
    var arr2 = [];
    for (var i in questionObj) {
        arr1.push(questionObj[i]);
    }
    for (var i in answerObj) {
        arr2.push(answerObj[i]);
    }
    return arr1.toString() == arr2.toString() ? 1 : 0;
}
var rs = handle(str);
console.log(rs);


  1. A-Za-z ↩︎

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值