重新整理幾次後學妹開始不耐煩,瘋狂點擊重新整理。
「等等,這樣算是一種DoS吧?會被擋IP的。」結果我阻止得太慢。已經被設定為拒絕往來戶了。
「啊,怎麼辦啊學姊?」學妹沒想到手速快也是個錯。
我深呼吸平靜了一下情緒:「都已經這樣了還能怎麼辦,只好等網站釋放我們的IP或是我們更換IP。」
結果等了很久都沒有被放出來,所以我們決定先好好休息,隔日再戰。
翌日。
「學姊,網站恢復正常了!」
聽到學妹的喊聲,我揉揉還有些困倦的眼睛,瞇著眼回覆她:「好啦,沒事就好,那今天也繼續努力解題吧。」
「學姊我開了一題easy的題目872. Leaf-Similar Trees,但是有點卡關,幫我看看吧。」
我匆匆洗把臉後,看向學妹寫的程式碼,有時候看程式碼比看題目快。
class Solution {
fun leafSimilar(root1: TreeNode?, root2: TreeNode?): Boolean {
val leaf1 = LinkedList<Int>()
val leaf2 = LinkedList<Int>()
getLeaf(root1!!, leaf1)
getLeaf(root2!!, leaf2)
return leaf1 == leaf2
}
fun getLeaf(node: TreeNode, list: MutableList<Int>) {
node.left?.let {
getLeaf(it, list)
node.right?.let {
getLeaf(it, list)
}
} ?: node.right?.let {
getLeaf(it, list)
} ?: list.add(node.`val`)
}
「哦,是要把leaf找出來,然後比對吧。」
「是呀,但是怪怪的,在這個例子會出錯。」
[1,2]
[2,2]
我重新看了一次程式碼,找到了原因。「妳有個?.
沒有放?:
,結果在node.right是Null的情況下,程式跑去執行另一個存在的Null行程,把有left的root也當作leaf。」
「了解,馬上改!」
學妹不愧是個行動派,馬上就開始修正程式碼。
「既然要改,那就把LinkedList改成Stack吧,速度會更快唷。」
class Solution {
fun leafSimilar(root1: TreeNode?, root2: TreeNode?): Boolean {
val leaf1 = Stack<Int>()
val leaf2 = Stack<Int>()
getLeaf(root1!!, leaf1)
getLeaf(root2!!, leaf2)
return leaf1 == leaf2
}
fun getLeaf(node: TreeNode, stack: Stack<Int>) {
node.left?.let {
getLeaf(it, stack)
node.right?.let {
getLeaf(it, stack)
} ?: return
} ?: node.right?.let {
getLeaf(it, stack)
} ?: stack.add(node.`val`)
}
}
「那乾脆改成ArrayDeque?我記得學姊說過,ArrayDeque沒有synchronized所以比Stack更快。」
「不行喔,雖然我們的確沒遇上需要synchronized的情境,但因為ArrayDeque沒有覆蓋原生的相等equals判斷,所以沒辦法直接比較不同ArrayDeque的成員是不是相同。」
我們興奮地討論更好更快的做法。
所以沒有注意到,門上的5不知道何時掉了下來,卡在橫槓上,形成了∞的符號。
Bad End