题目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);
A-Za-z ↩︎