泰康前端面试题解析(2020)

码农天地 -
泰康前端面试题解析(2020)

昨天解了一下拔高题解一道泰康的拔高面试题:面积占比,今天把所有题要过来解析一下。顺便升级一下我司的面试题。

基础题用 var、let、const 声明的变量有什么区别?题目描述

用 var、let、const 声明的变量有什么区别?

作用域:

A. 函数级B. 代码块级

能否给变量重新赋值:

A. 能B. 不能答案 作用域重新赋值varAAletBAconstBB函数的 call、apply、bind 有什么区别?题目描述

函数的 call、apply、bind 有什么区别?

传参方式:

A. 以数组的形式,把参数整体传递B. 逐个传递参数

返回值:

A. 函数执行结果B. 返回一个新的函数,再次调用才能得到结果。可以多次调用答案 传参方式返回值callBAapplyAAbindBBquerySelectorAll('div') 获取的是真正的数组吗?那么是什么?怎么变为数组?题目描述

有代码 var links = document.querySelectorAll('a') ,links 变量是真正的数组吗?如何变成真正的数组?

答案

不是真正的数组,没有数组上的方法(.join之类的),类似的还有 arguments
可以通过 Array.from(links) 来转换为真正的数组。

使用 Math.max 函数,获取数字类型数组中最大值题目描述

prices 是数值类型的数组,至少有一个元素。请用展开运算符和 Math.max 函数,写一句代码取得他的元素最大值。

答案

Math.max(...prices)

用css实现一个匀速5s从左到右400px无限循环的动画解题
<div >1</div>

@keyframes left2right2{
    0%{margin-left: 0;}
    100%{margin-left: 400px}
}
.demo2{
    animation: left2right2 5s linear infinite;
}
计算上海证券交易所的交易日题目描述

上海证券交易所对 2020 年下半年的交易日规定如下:

每个周六日都不是交易日中秋和国庆 10月1日(含)至10月8日(含)不交易除以上外,其他日期都是交易日
// date 是 Date 类型的变量,且为2020年下半年
// 交易日返回 true
function isTradingDay(date){

}
解题
function isTradingDay(date){
    if(date.getDay() == 0) return false;//周日
    if(date.getDay() == 6) return false;//周六
    if(date.getMonth() == 9){ // 十月份
        if(date.getDate() < 9) return false;
    }
    return true
}
计算两点之间的距离题目描述

城市区域在坐标系的x=0到x=100之间,y=0到y=100之间,是个正方形。有三个点发现新冠病毒,它们的坐标是A(20, 30), B(50, 80), C(70, 50)。与这三个点距离15以内(含等于15)的圆形地方(阴影部分)是危险的地方,其它地方(空白部分)是安全的地方。某保险公司想给居住在安全地区的人保费优惠。现给一点P的坐标x和y,求P是否安全。
如果你几何学得不好,解题时可以把危险区域的形状当成边长为30的正方形。

function isSafe(x, y) {
  // 具有危险的地点
  var dangers = [
    {x: 20, y: 30}, // A点
    {x: 50, y: 80}, // B点
    {x: 70, y: 50}, // C点
  ]
// 注意,要在本函数中返回true或false,不要用alert/console.log打印!
}
解题
function isSafe(x, y) {
  // 具有危险的地点
  var dangers = [
    {x: 20, y: 30}, // A点
    {x: 50, y: 80}, // B点
    {x: 70, y: 50}, // C点
  ]
  // 注意,要在本函数中返回true或false,不要用alert/console.log打印!


  // 圆心点的距离
  return dangers.every((p1)=>{
    return Math.sqrt(Math.pow(p1.x - x, 2) + Math.pow(p1.y - y, 2)) > 15
  })
}
拔高题估算名次区间题目描述

你参加申报北京市的积分落户,得到一部分数据:

你自己的分数,数字类型的score。参加申报的总人数,数字类型的total。一部分申报人的信息(即样本),数组类型的sample。每个元素是个Object,代表一个申报人,它有两个属性:
a. 分数,数字类型的score。
b. 名次,数字类型的rank。

sample会按申报人的分数从低到高排列,且保证不存在自相矛盾之处。
请写一个函数getRankRange,根据以上信息,计算并返回你的名次范围。
设sample.length === n,函数要达到线性O(n)时间复杂度。
你也可以在给出线性时间的解法后,挑战高难度的对数O(lgn)。

function getRankRange(score, total, sample) {
  // 请实现本函数,返回的数据结构:
  // { min: 你可能的最高名次, max: 你可能的最低名次 }

}

示例1:

var score = 90 // 你得90分
var total = 100000 // 共10万人申报
var sample = [
// 样本是空的
]
getRankRange(score, total, sample)

返回:{ min: 1, max: 100000 }
说明:因为样本是空的,所以最好的情况你是第一名,最坏的情况你的名次就是申报人数。

示例2:

var score = 90 // 你得90分
var total = 100000 // 共10万人申报
var sample = [
  {
    score: 70,
    rank: 60000,
  },
  {
    score: 80,
    rank: 30000,
  },
  // 路人甲与你分数相同
  { 
    score: 90,
    rank: 20000,
  },
]
getRankRange(score, total, sample)

返回:{ min: 20000, max: 20000 }
说明:因为路人甲跟你分数相同,他的名次20000当然就是你的名次!

示例3:

var score = 90 // 你得90分
var total = 100000 // 共10万人申报
var sample = [
  {
    score: 70,
    rank: 60000,
  },
  // 路人乙是sample中分数仅次于你的
  {
    score: 80,
    rank: 30000,
  },
  // 路人丙是sample中分数首个比你高的
  {
    score: 95,
    rank: 8000,
  },
  {
    score: 100,
    rank: 4000,
  },
  {
    score: 105,
    rank: 1000,
  },
]
getRankRange(score, total, sample)

返回:{ min: 8001, max: 29999 }
说明:你的分数恰好介于路人乙和路人丙之间,所以你的名次在8000 + 1和30000 - 1之间。

泰康有一项福利,只要你在昌平区或其它郊区有房,在泰康每工作一年,积分可加1分。

解题
function getRankRange(score, total, sample) {
  // 请实现本函数,返回的数据结构:
  // { min: 你可能的最高名次, max: 你可能的最低名次 }
    if(sample.length == 0) return {min: 1, max: total};
    var arr = [];
    for(var i = 0, l = sample.length; i < l ; i++){
        var item = sample[i];
        arr[item.score] = item.rank;
    }
    if(arr[score]){
        return {min:arr[score],max:arr[score]}
    }else{
        var min = 1;
        var max = total;
        for(var i = score, l = 100; i < l; i++){
            if(arr[i]){
                min = arr[i]+1;
                break;
            }
        }
        for(var i = score, l = 0; i > l; i--){
            if(arr[i]){
                max = arr[i]-1;
                break;
            }
        }
        return {min:min,max:max}
    }
}
测试用例截图

薪资倒挂调查题目描述

你想调查某公司的薪资倒挂情况。所谓倒挂,在本题中指的是一个员工的薪资比他的直接上司还高的情况。现在你找到一个基层员工,想通过他调查他的各级上司工资情况。有以下规则:

当你找到任何一人时,都能问到他本人的工资。通过已知的人,能找到他的直接上司。如果此人是最大的老板,则他的上司为null。但是,通过一个员工无法找到他的越级上司。也无法找到他的下属。

注意我们所说的倒挂只发生在直接上下级之间。对于越级的人,无论如何不存在倒挂的情况。
设有Employee类,已知它的构造函数(数据结构)是

function Employee(salary, leader) {
  // salary表示员工的工资,是个正整数
  this.salary = salary
  // leader属性指向员工的直接上司,类型为Employee。
  // 如果员工已是最大老板,则leader为null
  this.leader = leader || null
}

请写一个函数 getInfo(employee) ,参数 employee 为你初始知道的员工。返回一个具有2个元素的数字数组,第0个元素表示你一共能找到几个员工(包括初始的员工),第1个元素表示有几对直接上下级的工资倒挂。
如果你能顺着初始的基层员工共找到n个员工,你的函数时间复杂度要达到O(n),空间复杂度要达到O(1)。也就是说,不能把已找到的各位员工放进数组。
例:如下图,是某公司的级别结构。初始的时候,你只找到了基层的alice。

// 从上到下,建立该公司的上下级关系链,共8个人。
// 作为测试用例,你答题时可以用它调试
// boss是最大的老板,工资是6
var boss = new Employee(6)
// john是boss的直接下属,一人之下万人之上的角色,工资是2
var john = new Employee(2, boss)
// hugh是john的下属。以下也是逐级递减的
var hugh = new Employee(9, john)
var fred = new Employee(5, hugh)
var david = new Employee(1, fred)
var cindy = new Employee(4, david)
var bob = new Employee(1, cindy)
// alice是你初始找到的基层员工。她的上司是bob,工资是3。
var alice = new Employee(3, bob)

function getInfo(employee) {
// 请在这里实现getInfo函数

}

// 调用你的getInfo函数,参数为你初始拿到的基层员工alice
var info = getInfo(alice)
var [employeeCount, reverseCount] = info
console.log(`共有${employeeCount}个员工,其中有${reverseCount}对直接上下级工资倒挂`)
// 输出的两个数字应该分别是8和3,表示有8个员工,有3对倒挂关系。
// 因为alice和bob, cindy和david,hugh和john这3对上下级工资是倒挂的。
解题
function getInfo(employee) {
    var count = 0;
    var arrcount = 1;
    while(employee.leader){
        arrcount++;
        var leader = employee.leader
        if(leader.salary < employee.salary) count++
        employee = leader
    }
    return [arrcount, count]
}
测试用例截图

async、await题目描述

把以下代码改成等效的 async...await代码。把.then().catch().finally()消灭掉。

// axios.get类似$.ajax,是ajax操作,返回的也是Promise
axios.get('/products.json')
  .then(response => {
    const { data } = response
    return data
  })
  .catch(err => console.warn('request error: ', err))
  .then(data => console.log('key: ', data.key))
  .finally(() => $loading.hide())
解题
(async function(){
    try{
        var response = await axios.get('/products.json');
        var {data} = response;
    }catch(err){
        console.warn('request error: ', err)
    }finally{
        console.log('key: ', data.key)
        $loading.hide()
    }

    console.log(response, data)
})()
(async function(){
    try{
        var response = await axios.get('/products.json');
        var {data} = response;
    }catch(err){
        console.warn('request error: ', err)
    }
    console.log('key: ', data.key)
    $loading.hide()
    
})()
(async function(){
    try{
        var data = await axios.get('/products.json').data
    }catch(err){
        console.warn('request error: ', err)
    }
    console.log('key: ', data.key)
    $loading.hide()
    
})()
面积占比问题描述

拔高:保险公司想知道危险地区的面积占全市面积的百分比。如图,如果危险地区有更多个,且它们的圆有重叠(图中C和D,B和E),而且有些圆的一部分跑到了市外(图中E),形成不规则图形。有什么办法近似求出危险地区所占的面积?可以调用上一问的isSafe()函数。

这道题我们昨天写了:解一道泰康的拔高面试题:面积占比

解题
baseList = [
    {type: 'rect', x: 0, y: 0, w: 100, h: 100}
]
warnList = [
    {type: 'round', x: 60, y: 95, r: 10},
    {type: 'round', x: 50, y: 80, r: 10},
    {type: 'round', x: 20, y: 30, r: 10},
    {type: 'round', x: 70, y: 50, r: 10},
    {type: 'round', x: 80, y: 25, r: 10}
]

function isSafe(x, y) {
  // 具有危险的地点
  var dangers = warnList
  // 两点的距离
  return dangers.every((p1)=>{
    return Math.sqrt(Math.pow(p1.x - x, 2) + Math.pow(p1.y - y, 2)) > p1.r
  })
}

count = 0;//循环次数代表点数,其实可以直接乘出来。
countSafe = 0;
for(let xStart = baseList[0].x, xEnd = baseList[0].x + baseList[0].w; xStart <= xEnd; xStart++ ){
    for(let yStart = baseList[0].y, yEnd = baseList[0].y + baseList[0].h; yStart <= yEnd; yStart++ ){
        count++
        if(isSafe(xStart, yStart)) countSafe++
    }
}
console.log(count, countSafe, 1-(countSafe/count))
微信公众号:前端linong

欢迎大家关注我的公众号。有疑问也可以加我的微信前端交流群。

特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

Tags 标签

加个好友,技术交流

1628738909466805.jpg