记录几个有趣的面试题

平时会看到一些,或者其他分享的有趣的面试题。
特在此处整理。你问我为什么?
记录几个有趣的面试题_第1张图片

数组相关

分割数组

问题描述
写一个函数 xxx(n,m) 实现将1~n平均的分为m组,
如输入 xxx(5,2)
输出 [[1,2,3],[4,5]]
输入 xxx(10,6)
输出 [[1,2],[3,4],[5,6],[7,8],[9],[10]]

  • 思路来源
const chunk = (arr, size) =>
Array.from({length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size));
  • 最终结果
const chunk = (m,n)=>{
    const arr = Array(m).fill(0).map((v,i)=>i);
    const size = m-n;
    return Array.from({length:n},(v,i)=>arr.slice(size*i,size*i+size));
}

思路
1. 填充数组arr
2. 根据要分割比例,计算每一份的大小,分割arr。

作用域

题目描述
如下代码将会输出什么结果

var a = 5;
function b(){
 if(!a){
    var a = 10;
 }
 console.log(a);
}
b();

本题考查函数作用域和变量提升。
分析

  1. js有三个作用域 global、块级作用域let,const(ES6新增)、function。if显然不是
  2. 声明变量会在解析过程中提升到作用域顶部执行。

由此可得: 在函数体b开始执行时,由于变量提升。 存在局部变量a初始值undefinded;所以最终答案是10
记录几个有趣的面试题_第2张图片

ES6相关

map+parseInt

题目描述
[1,7,11].map(parseInt) 输出结果为什么

要想弄清结果如何,必须先弄清这两个API的运作机制。

  • map接受一个callback(item,key,array,context)回调函数。
  • parseInt将参数按照约定类型转换,可接受两个参数。(str,radix)。radix是一个介于2~36之间的整数(对应进制类型);参数不填,或者为0默认是10进制

我们带入循环。

  • 1=> parseInt(1,0); // 十进制结果 1
  • 7=> parseInt(7,1); // 非法入参结果 NAN
  • 10=>parseInt(10,2);// 二进制结果 3

算法相关

编程题,请写一个函数,完成以下功能

输入 ‘1, 2, 3, 5, 7, 8, 10’ 输出 ‘1~3, 5, 7~8, 10’

function transArr(str) {
  return str.split(",").map((item, key, arr) => (arr[key + 1] != +item + 1 || key === 0 || arr[key - 1] != item - 1) ? item == +arr[key - 1] + 1 ? `,${item}` : item : ",").toString().replace(/(,)\1+/g, '~')
}

思路

  1. 标识符合位置 : [1,2,3,8,9,10] >> [1,undefined,’,3’,8,undefinded,’,10’]
  2. toString 去undefinded 1,3,8,10
  3. 利用replace 替换 ,,~ 完成。

你可能感兴趣的:(技术杂谈)