泰康前端面試題解析(2020)

昨天解了一下拔高題解一道泰康的拔高面試題:面積佔比,今天把全部題要過來解析一下。順便升級一下我司的面試題。css

基礎題

用 var、let、const 聲明的變量有什麼區別?

題目描述

用 var、let、const 聲明的變量有什麼區別?前端

  • 做用域:ios

    • A. 函數級
    • B. 代碼塊級
  • 可否給變量從新賦值:面試

    • A. 能
    • B. 不能

答案

做用域 從新賦值
var A A
let B A
const B B

函數的 call、apply、bind 有什麼區別?

題目描述

函數的 call、apply、bind 有什麼區別?ajax

  • 傳參方式:json

    • A. 以數組的形式,把參數總體傳遞
    • B. 逐個傳遞參數
  • 返回值:axios

    • A. 函數執行結果
    • B. 返回一個新的函數,再次調用才能獲得結果。能夠屢次調用

答案

傳參方式 返回值
call B A
apply A A
bind B B

querySelectorAll('div') 獲取的是真正的數組嗎?那麼是什麼?怎麼變爲數組?

題目描述

有代碼 var links = document.querySelectorAll('a') ,links 變量是真正的數組嗎?如何變成真正的數組?segmentfault

答案

不是真正的數組,沒有數組上的方法(.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 年下半年的交易日規定以下:

  1. 每一個週六日都不是交易日
  2. 中秋和國慶 10月1日(含)至10月8日(含)不交易
  3. 除以上外,其餘日期都是交易日
// 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
  })
}

拔高題

估算名次區間

題目描述

你參加申報北京市的積分落戶,獲得一部分數據:

  1. 你本身的分數,數字類型的score。
  2. 參加申報的總人數,數字類型的total。
  3. 一部分申報人的信息(即樣本),數組類型的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}
    }
}

測試用例截圖

image.png

薪資倒掛調查

題目描述

你想調查某公司的薪資倒掛狀況。所謂倒掛,在本題中指的是一個員工的薪資比他的直接上司還高的狀況。如今你找到一個基層員工,想經過他調查他的各級上司工資狀況。有如下規則:

  1. 當你找到任何一人時,都能問到他本人的工資。
  2. 經過已知的人,能找到他的直接上司。若是此人是最大的老闆,則他的上司爲null。
  3. 可是,經過一個員工沒法找到他的越級上司。也沒法找到他的下屬。

注意咱們所說的倒掛只發生在直接上下級之間。對於越級的人,不管如何不存在倒掛的狀況。
設有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]
}

測試用例截圖

image.png

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()函數。
image.png

這道題咱們昨天寫了:解一道泰康的拔高面試題:面積佔比

解題

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

歡迎你們關注個人公衆號。有疑問也能夠加個人微信前端交流羣。

clipboard.png

相關文章
相關標籤/搜索