昨天解了一下拔高题解一道泰康的拔高面试题:面积占比,明天把所有题要过去解析一下。顺便降级一下我司的面试题。
根底题
用 var、let、const 申明的变量有什么区别?
题目形容
用 var、let、const 申明的变量有什么区别?
-
作用域:
- A. 函数级
- B. 代码块级
-
是否给变量从新赋值:
- A. 能
- B. 不能
答案
作用域 | 从新赋值 | |
---|---|---|
var | A | A |
let | B | A |
const | B | B |
函数的 call、apply、bind 有什么区别?
题目形容
函数的 call、apply、bind 有什么区别?
-
传参形式:
- A. 以数组的模式,把参数整体传递
- B. 一一传递参数
-
返回值:
- A. 函数执行后果
- B. 返回一个新的函数,再次调用能力失去后果。能够屡次调用
答案
传参形式 | 返回值 | |
---|---|---|
call | B | A |
apply | A | A |
bind | B | B |
querySelectorAll(‘div’) 获取的是真正的数组吗?那么是什么?怎么变为数组?
题目形容
有代码 var links = document.querySelectorAll('a')
,links 变量是真正的数组吗?如何变成真正的数组?
答案
不是真正的数组,没有数组上的办法(.join
之类的),相似的还有 arguments
。
能够通过 Array.from(links)
来转换为真正的数组。
应用 Math.max 函数,获取数字类型数组中最大值
题目形容
prices 是数值类型的数组,至多有一个元素。请用开展运算符和 Math.max 函数,写一句代码获得他的元素最大值。
答案
Math.max(...prices)
用 css 实现一个匀速 5s 从左到右 400px 有限循环的动画
解题
<div class="demo demo2">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
欢送大家关注我的公众号。有疑难也能够加我的微信前端交换群。