遇到的真實面試題,可惜太菜了,希望下次別再犯錯吧
參考:
思路:進一步追問:如何使用常量空間o(1),常量時間o(1)完成這一操作:想到使用輔助棧,用來儲存當前棧的最大值,每次查詢棧的最大值時,將對應棧的最大值一起彈出既可;
演算法描述:
建立2個棧,1個當前儲存棧,1個輔助最大值棧sm
當push入棧的元素大於當前最大元素時,將該元素壓入sm;
當push入棧的元素小於sm棧頂中最大元素時,將sm棧頂元素再壓入一次;
當當前最大元素被彈出時,輔助棧sm棧頂的元素也對應彈出;
查詢棧的最大值,也就是sm棧頂的元素
思路:使用乙個標記量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 無重複 注 武漢,中國 和...