# 第 81 - 90 题
# 81、打印出 1 - 10000 之间的所有对称数
例如:121、1331 等
[...new Array(10000).keys()].filter(x => {
return x > 10 && x === Number(x.toString().split('').reverse().join(''))
})
# 82、周一算法题之「移动零」
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
复制代码
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
var arr = [0, 1, 0, 3, 12];
let index = 0;
let current = 0;
while (index < arr.length) {
if (arr[current] === 0) {
arr.splice(current, 1)
arr.push(0);
} else {
current++
}
index++
}
return arr
// 这个方法不符合题意,因为没有改变原数组(仅作为思维发散而用)
let nums = [0, 0, 0, 1, 0, 3, 12];
console.log(moveZeroToLast(nums)); // [1, 3, 12, 0, 0, 0, 0]
function moveZeroToLast(arr) {
let len = arr.length;
return arr.filter(it => it === 0 ? len-- && false : true)
.concat(Array(arr.length - len).fill(0));
}
# 83、var、let 和 const 区别的实现原理是什么;
var: 变量声明式 在let命令声明变量tmp之前,都属于变量tmp的“死区”。 原理这玩意真不太清楚
# 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
function add() {
const arg = [...arguments];
let addFun = function () {
arg.push(...arguments);
return addFun;
}
addFun.toString = function () {
return arg.reduce((a, b) => a + b, 0);
}
return addFun;
}
// 函数柯里化
function curry(fn) {
const len = fn.length;
return function add() {
const arg = arguments;
if (arguments.length === len) {
fn.apply(undefined, [...arguments]);
} else {
return () => {
return add.apply(null, [...arg, ...arguments]);
}
}
}
}
# 85、react-router 里的 标签和 标签有什么区别
href:javascript:; (event.preventDefault())
如何禁掉 <a> 标签默认事件,禁掉之后如何实现跳转。
link: 无刷新页面跳转(监听hashchange)(redux数据不会更新)
a标签: 会刷新页面跳转(redux数据更新)
# 86、京东、快手)周一算法题之「两数之和」
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
function sum(nums, target) {
const map = new Map();
for (let i = 0; i < nums.length; i++) {
if (map.has(target - nums[i])) {
return [map.get(target - nums[i], i)];
}
map.set(nums[i], i);
}
return [];
}
# 87、在输入框中如何判断输入的是一个正确的网址。
一种思路,正则判断协议名、域名、路径参数
另外一种new URL()看是否成功。
# 88、实现 convert 方法,把原始 list 转换成树形结构,要求尽可能降低时间复杂度
以下数据结构中,id 代表部门编号,name 是部门名称,parentId 是父部门编号, 为 0 代表一级部门,现在要求实现一个 convert 方法, 把原始 list 转换成树形结构,parentId 为多少就挂载在该 id 的属性 children 数组下,结构如下:
// 原始 list 如下
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 }
];
const result = convert(list);
// 转换后的结果如下
let result = [
{
id: 1,
name: '部门A',
parentId: 0,
children: [
{
id: 3,
name: '部门C',
parentId: 1,
children: [
{
id: 6,
name: '部门F',
parentId: 3
}, {
id: 16,
name: '部门L',
parentId: 3
}
]
},
{
id: 4,
name: '部门D',
parentId: 1,
children: [
{
id: 8,
name: '部门H',
parentId: 4
}
]
}
]
}
];
function convert(list) {
const map = new Map(); // 借用对象内存指针指向堆
return list.reduce((pre, cur) => {
const { id, parentId } = cur;
if (parentId === 0) {
pre.push(cur);
} else {
const itemCache = map.get(parentId);
if (itemCache) {
itemCache.children = itemCache.children ? [...itemCache.children, cur] : [cur];
}
}
if (!map.has(id)) {
map.set(id, cur);
}
return pre;
}, []);
}
# 89、设计并实现 Promise.race()
# 90、实现模糊搜索结果的关键词高亮显示
// 核心点就是替换匹配到的关键字(记得排除有正则含义的字符串)。
let panter = new RegExp(关键词, 'g')
该行字符串.replace(panter, '<b style="color: #2D7BFF">' + 关键词 + '</b>')