# 前端面试题及答案汇总(八) 81-90
# 第 81 题:打印出 1 - 10000 之间的所有对称数
function symmetryNum(start, end) {
let res = [];
for (let i = start; i < end; i++) {
let str = i.toString();
let left = 0;
let right = str.length - 1;
let flag = true;
while (left < right) {
if (str[left] !== str[right]) {
flag = false;
break;
}
left++;
right--;
}
if (flag && i > 9) {
res.push(i);
}
}
return res;
}
console.log(symmetryNum(1, 10000));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[...Array(10000).keys()].filter(x => {
return (
x.toString().length > 1 &&
x ===
Number(
x
.toString()
.split("")
.reverse()
.join("")
)
);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 第 82 题:算法题「移动零」,给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
function moveZero(arr) {
if (!arr || arr.length === 0) {
return null;
}
let j = 0;
for (let i = 0, len = arr.length; i < len - j; i++) {
if (arr[i] === 0) {
arr.splice(i, 1);
arr.push(0);
j++;
i--;
}
}
return arr;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 第 83 题:var、let 和 const 区别的实现原理是什么
# 第 84 题:请实现一个 add 函数,满足以下功能
add(1); // 1
add(1)(2); // 3
add(1)(2)(3);// 6
add(1)(2, 3); // 6
add(1, 2)(3); // 6
add(1, 2, 3); // 6
1
2
3
4
5
6
2
3
4
5
6
const curry = fn => {
const len = fn.length;
return function curried(...args) {
if (args.length === len) {
return fn.apply(null, args);
}
return (..._args) => {
return curried.apply(null, [...args, ..._args]);
};
};
};
const sum = (x, y, z) => x + y + z;
const add = curry(sum);
// 6
add(1, 2, 3);
// 6
add(1, 2)(3);
// 6
add(1)(2, 3);
// 6
add(1)(2)(3);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const add = function(...args) {
let sum = args.reduce((a, b) => a + b, 0);
let temp = function(..._args) {
sum = _args.reduce((a, b) => a + b, sum);
return temp;
};
temp.toString = function() {
return sum;
};
return temp;
};
console.log(add(1)); //1
console.log(add(1)(2)); //3
console.log(add(1)(2)(3)); //6
console.log(add(1, 2)(3)); //6
console.log(add(1)(2, 3)); //6
console.log(add(1)(2)(3)(4)); //10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 第 85 题:react-router 里的 Link 标签和 a 标签有什么区别
# 第 86 题:(京东、快手)周一算法题之「两数之和」
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
if (!nums || nums.length === 0) {
return null;
}
for (let i = 0, len = nums.length; i < len; i++) {
let diff = target - nums[i];
for (let j = i + 1; j < len; j++) {
if (nums[j] === diff) {
return [i, j];
}
}
}
return null;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
if (!nums || nums.length === 0) {
return null;
}
let res = {};
for (let i = 0, len = nums.length; i < len; i++) {
if (res[nums[i]] || res[nums[i]] === 0) {
return [res[nums[i]], i];
}
let diff = target - nums[i];
res[diff] = i;
}
return null;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 第 87 题:在输入框中如何判断输入的是一个正确的网址。
function isUrl(url) {
try {
new URL(url);
return true;
} catch (err) {
return false;
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 第 88 题:实现 convert 方法,把原始 list 转换成树形结构,要求尽可能降低时间复杂度
var convert = function(arr) {
if (!arr || arr.length === 0) {
return null;
}
let res = [];
let hash = new Map();
arr.forEach(item => {
hash.set(item.id, item);
});
arr.forEach(item => {
let id = item.parentId;
if (id === 0) {
res.push(item);
} else {
let parent = hash.get(id);
parent["children"] = item;
}
});
return res;
};
let list = [
{ id: 1, name: "部门A", parentId: 0 },
{ id: 2, name: "部门B", parentId: 0 },
{ id: 3, name: "部门C", parentId: 1 },
{ id: 4, name: "部门D", parentId: 1 },
{ id: 5, name: "部门E", parentId: 2 },
{ id: 6, name: "部门F", parentId: 3 },
{ id: 7, name: "部门G", parentId: 2 },
{ id: 8, name: "部门H", parentId: 4 }
];
console.log(convert(list));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 第 89 题:设计并实现 Promise.race()
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("success");
}, 1000);
});
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject("failed");
}, 500);
});
var _race = function(promises) {
return new Promise((resolve, reject) => {
if (!Array.isArray(promises)) {
reject();
}
promises.length !== 0 &&
promises.forEach(promise => {
Promise.resolve(promise).then(resolve, reject);
});
});
};
_race([p1, p2])
.then(res => {
console.log(res);
})
.catch(err => {
console.error(err);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28