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