深信服 星耀前端一面面經+二面涼了

5.30 下午5.30的場子 一面的小姐姐人真的很好,而且會引導和疏導,剛開始還挺緊張的後面就還好,雖然很多東西都記不太好,不過還是希望有二面吧
面試官小姐姐說2技術面+1hr面,第二面可能偏重原理、數據結構、算法了

姓名拼音轉駝峯 replace正則
數組去重 set和遍歷
冒泡排序
取整 parseint 第二個參數默認值爲十進制
es6的解構 三等號和兩等號 reduce的用法
預加載和懶加載
react的生命週期
react的refs 虛擬dom獲取
react的其他情況
call和apply的區別 傳參方法
虛擬dom的優勢和diff
float的值 none left right inherit
各種水平垂直居中,捎帶兼容性理解
跨域的實現方法
http狀態碼 1 2 3 4 5 404 304
緩存頭 協商緩存 ETag和if-modified-since ETag優先級高

二面 6.7下午2.30 約40分鐘

先問我項目
直接切入到跨域和seo的底層原理,很深
已經發布的項目想獲取b域名(不是自家的)的數據,怎麼post跨域,我說不知道(網上只找到了cors解決)
怎麼get? 我說jsonp 說說jsonp的實現和回調
img可以嗎?我說可以,img怎麼回調判斷狀態,我不知道。
(img元素能添加onError onLoad 屬性,用於監聽加載失敗或者加載成功。)
seo, 單頁面應用reactapp,多頁面應用nextapp,以及自己寫的多入口項目 針對seo他們有啥區別,我說了半天可能沒說到他想聽的,況且我也沒深入瞭解(沒查到合適的解釋)
最近在學什麼,我說markdown解析的一個案例,怎麼實現的?我說他是用的一個插件。你怎麼實現?我說匹配啊加標籤啊高亮啊什麼的巴拉巴拉
最後是一個匹配n叉樹路徑的算法

作者:mus。
鏈接:https://www.nowcoder.com/discuss/434043
來源:牛客網

題目:實現一個對樹型結構進行過濾的函數,其中樹形結構的格式如下:
 
tree = [
{name: 'A'},
{name: 'B', children: [
{name: 'A'},
{name: 'AA', children: [...]}
]},
{name: 'C'}
]
 
1. 假設我輸入的 str 爲 A 則過濾後返回的結果爲
[
{name: 'A'},
{name: 'B', children: [
{name: 'A'}
]}
]
 
2. 假設我輸入的 str 爲 AA 則過濾後返回的結果爲
[
{name: 'B', children: [
{name: 'AA', children: [...]}
]}
]
 
3. 假設我輸入的 str 爲 B 則過濾後返回的結果爲
[
{name: 'B', children: [
{name: 'A'},
{name: 'AA', children: [...]}
]}
]
 
 
// 實現該函數,要求不允許對原有的tree做任何修改,最終返回結果是一棵新結構出來的樹
function filter (tree, str) {
 
 
 
}

我遞歸實在不行 寫了好久沒寫出來 大致思路也只能停留於我能找到那個子節點,路徑怎麼存下來我覺得要寫一個頂層的tmp,但是我現撕肯定是寫不出來的。。。這種難度我刷力扣都是看答案的。。
(等我看看寫出來的話掛上來)

大概用了一個小時的時間才寫出,一個用隊列的方式層序便利同時保存路徑,然後淺拷貝穿單鏈表

作者:mus。
鏈接:https://www.nowcoder.com/discuss/434043
來源:牛客網

const tree = [
  { name: "A" },
  { name: "B", children: [{ name: "A" }] },
  {
    name: "AA",
    children: [
      { name: "BB" },
      { name: "C" },
      { name: "D", children: [{ name: "A" }] },
    ],
  },
  { name: "D", children: [{ name: "C", children: [{ name: "AA" }] }] },
];
function filter(tree, str) {
  let arr = [...tree];
  arr = arr.map((a) => [a, []]); //給一個二維環境,這裏用數組,用Map也可以
  let tmp = [];
  while (arr.length > 0) {
    let a = arr.shift();
    if (a[0].name == str) {
      tmp.push(a);
      continue;
    } //匹配就放進去
    if (a[0].children) {
      a[0].children.map((b) => {
        arr.push([b, a[1].concat(a[0])]);
      });
    } //如果有孩子就把孩子放入待檢測隊列,同時把父親按照層順序存到father數組中
  }
  //console.log(tmp)//tmp數組每一項都是[節點,路徑[]]
  let res = [];
  for (let i = 0; i < tmp.length; i++) {
    if (tmp[i][1].length == 0) {
      res.push(tmp[i][0]);
      continue;
    } //如果恰好是第一層,路徑就是空的
 
    //正常情況下我們新建一個對象,採用單鏈表的方式創建淺拷貝路徑
    let o = {};
    let p = o;
    while (tmp[i][1].length > 0) {
      //console.log(tmp[i],i)
      let m = tmp[i][1].shift();
      o.children = { name: m.name };//淺拷貝name屬性到children上
      o = o.children;
    }
    //得到路徑串聯爲p.children,但是此時還沒把這個節點本身穿進來
    o.children = tmp[i][0];
    res.push(p.children); //push形成的新的單鏈拷貝
  }
  //console.log(res)
  return res;
}
console.log(tree);
let tf = filter(tree, "AA");
console.log(tf)

在這裏插入圖片描述
所有的判斷操作都是通過 [節點,路徑[]]這種模擬Map來判斷的,然後後面連接的操作是淺拷貝實現的
沒有改變原tree
在這裏插入圖片描述
仍然還有一點bug沒解決,由於是單鏈表搞定的,所以如果有公用的父級路徑,也會單獨開闢新的完整路徑
感覺如果想解決得換其他算法。。
這是同學一個大佬寫的,先貼上來

function clear(tree, str) {
  let result = [];
  tree.forEach((item) => {
    if (item.name == str) {
      result.push(item);
    } else {
      if (item.children) {
        let obj = clear(item.children, str);
        if (obj.length > 0) {
          item.children = obj;
          result.push(item);
        }
      }
    }
  });
  return result;
}

反問環節:我學的時間比較短,您覺得應該側重什麼。
他說:基礎、原理、算法
okfine。。我可能就是kpi本k

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章