# 第 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、在输入框中如何判断输入的是一个正确的网址。

什么是URL (opens new window);

一种思路,正则判断协议名、域名、路径参数

另外一种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>')
Last Updated: 4/14/2022, 9:00:50 PM