昨天解了一下拔高题解一道泰康的拔高面试题:面积占比,今天把全部题要过来解析一下。顺便升级一下我司的面试题。css
用 var、let、const 声明的变量有什么区别?前端
做用域:ios
可否给变量从新赋值:面试
做用域 | 从新赋值 | |
---|---|---|
var | A | A |
let | B | A |
const | B | B |
函数的 call、apply、bind 有什么区别?ajax
传参方式:json
返回值:axios
传参方式 | 返回值 | |
---|---|---|
call | B | A |
apply | A | A |
bind | B | B |
有代码 var links = document.querySelectorAll('a')
,links 变量是真正的数组吗?如何变成真正的数组?segmentfault
不是真正的数组,没有数组上的方法(.join
之类的),相似的还有 arguments
。
能够经过 Array.from(links)
来转换为真正的数组。数组
prices 是数值类型的数组,至少有一个元素。请用展开运算符和 Math.max 函数,写一句代码取得他的元素最大值。安全
Math.max(...prices)
<div class="demo demo2">1</div> @keyframes left2right2{ 0%{margin-left: 0;} 100%{margin-left: 400px} } .demo2{ animation: left2right2 5s linear infinite; }
上海证券交易所对 2020 年下半年的交易日规定以下:
// 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 }) }
你参加申报北京市的积分落户,获得一部分数据:
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} } }
你想调查某公司的薪资倒挂状况。所谓倒挂,在本题中指的是一个员工的薪资比他的直接上司还高的状况。如今你找到一个基层员工,想经过他调查他的各级上司工资状况。有如下规则:
注意咱们所说的倒挂只发生在直接上下级之间。对于越级的人,不管如何不存在倒挂的状况。
设有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
代码。把.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))
欢迎你们关注个人公众号。有疑问也能够加个人微信前端交流群。