# 前端面试题及答案汇总(八) 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
[...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

# 第 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

# 第 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
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
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

# 第 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
/**
 * @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

# 第 87 题:在输入框中如何判断输入的是一个正确的网址。

function isUrl(url) {
  try {
    new URL(url);
    return true;
  } catch (err) {
    return false;
  }
}
1
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

# 第 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

# 第 90 题:实现模糊搜索结果的关键词高亮显示