20210322筆試小記

2021-10-22 21:59:05 字數 4098 閱讀 8683

遇到的真實面試題,可惜太菜了,希望下次別再犯錯吧

參考:

思路:

想到使用輔助棧,用來儲存當前棧的最大值,每次查詢棧的最大值時,將對應棧的最大值一起彈出既可;

演算法描述:

建立2個棧,1個當前儲存棧,1個輔助最大值棧sm

當push入棧的元素大於當前最大元素時,將該元素壓入sm;

當push入棧的元素小於sm棧頂中最大元素時,將sm棧頂元素再壓入一次;

當當前最大元素被彈出時,輔助棧sm棧頂的元素也對應彈出;

查詢棧的最大值,也就是sm棧頂的元素

進一步追問:如何使用常量空間o(1),常量時間o(1)完成這一操作

思路:使用乙個標記量max記錄當前最大值,每次num入棧時,入棧值為(num-max),出棧時+max進行相應變換;

迭代演算法中,每遇到乙個結點a,就應該立即訪問它,

每顆子樹先訪問先訪問其根節點,對節點左右子樹來說,一定是先訪問根

在a的兩棵子樹中,遍歷完左子樹後,再遍歷右子樹

在訪問完根結點後,需要將右子樹入棧;

//模板

棧s;p = root;

while

(p != null ||

!s.isempty()

) p = s棧頂彈出

}

class

solution

root = stack.

pop();

}return res;

}}

後序遍歷:左右根,與前序遍歷類似

每遇到乙個結點 ,立即訪問它,然後將左子樹入棧,訪問右子樹—>這樣得到的順序為根右左,倒序後為左根右;

//目標

stack s;

p = root;

while

(p != null ||

!stack.

isempty()

) p = s.

pop();

}將結果逆序輸出

//coding

class

solution

root = stack.

pop();

if(root.right == null || root.right == prev)

else

}return res;

}}

class

solution

root = stack.

pop();

} collections.

reverse

(res)

;//反轉為左右根

return res;

}}

思路:每到乙個節點 a,因為根的訪問在中間,將 a 入棧。然後遍歷左子樹,接著訪問 a,最後遍歷右子樹。

在訪問完 a 後,a 就可以出棧了。因為 a 和其左子樹都已經訪問完成。

//偽**

棧s;p = root;

while

(p != null || s != 空)

p = s.

pop();

訪問p;

p = p的右子樹;

}

class

solution

root = stack.

pop();

res.

add(root.val)

;//先訪問左

root = root.right;

}return res;

}}

遞迴方式:

思路:借助棧結構來儲存路徑上的節點,首先從根結點開始,一直往左找,如果左邊找到就返回true;否則,如果左邊找不到並且右子樹不為空的情況下再繼續往右子樹找,如果左右子樹都找不到,則返回false,方法執行完,棧中儲存的就是從根到給定結點的路徑

public

static

boolean

searchnode

(treenode root , stack

s , treenode node)

非遞迴實現:

}//左子樹為null,開始往棧頂的右子樹上找if(

!s.isempty()

)//繼續遍歷p的右子樹

p = p.right;}}

}

給你二叉樹的根節點root,返回它節點值的前序遍歷。

迭代實現:使用棧,

前序遍歷:根左右,

入棧方式應該為:右左根

class

solution

return res;

}}

遞迴寫法

class

solution

private

void

dfs(treenode root, list

res)

}

給定乙個二叉樹,返回它的 後序 遍歷。

考慮它的迭代實現:

前序遍歷:根-左-右

後序遍歷:左右根;

修改前序遍歷為:根-右-左,則其倒序就為後序遍歷

collections.reverse(list> list): 翻轉列表元素

class

solution

collections.

reverse

(ret)

;return ret;

}}

class

solution

private

void

dfs(treenode root, list

res)

}

給定乙個二叉樹的根節點root,返回它的中序遍歷。

迭代實現:

class

solution

treenode node = stack.

pop();

res.

add(node.val)

; root = node.right;

}return res;

}}

遞迴實現

class

solution

private

void

dfs(treenode root , list

res)

}

2015筆試記錄

0916去哪兒網 1.removeelement arr,index 這麼簡單的題竟然寫錯了,把splice方法的返回值記錯了,splice返回的是刪除的元素陣列!2.陣列亂序問題 以前看過fisher yates的洗牌演算法,所以有點思路,但還是有細節錯誤 math.random 的範圍是 0,1...

中興2016筆試

簡答題 1 ip位址和mac位址有什麼區別?為什麼要有這兩種位址?對於ip位址,相信大家都很熟悉,即指使用tcp ip協議指定給主機的32位位址。ip位址由用點分隔開的4個8八位組構成,如192.168.0.1就是乙個ip位址,這種寫法叫點分十進位制格式。ip位址由網路位址和主機位址兩部分組成,分配...

2019 6 5筆試回顧

1.union和union all的區別 答案來自w3cshool select city,country from customers union select city,country from suppliers 上面的語句返回t 消費者和t 商的城市,國家。set 無重複 注 武漢,中國 和...