演算法題摘錄六

2021-09-07 09:27:30 字數 3019 閱讀 9260

1:正規表示式匹配

出現0次:pattern[curr+2]與str[curr]比較

出現1次:pattern[curr+2]與str[curr+1]比較

出現多次:pattern[curr]與str[curr+1]比較

這三種情況都可能出現,遞迴這三種情況取或即可。

而每一位pattern匹配str,當pattern[curr]==str[curr]||(pattern[curr]=='.'&&str[curr]!='\0')時,則匹配當前字元,開始匹配下乙個字元;

直到pattern和str都匹配到了末尾,說明字串是這個正規表示式的句子,否則,只要其中一處不相等或者表示式到末尾而字串還沒匹配完,就不是它的句子。

2:判斷字串是否表示乙個數值

形如 +100、5e2,-123之類的都是能表示數字的字串。而12e、1ab2、+-3之類的則不是。

此題其實就是判斷輸入的字串是否匹配  數字  的正規表示式:[sign] digits [[.][digits]] [e|e [sign]digits]

遍歷輸入的字串,開頭如果有+-號的乙個,則匹配sign,匹配下乙個;

遍歷數字,如果遇到  '.' ,轉入匹配小數,小數部分只能是純數字;如果遇到e|e,則轉入匹配科學記數法,後面如果有符號則只能正負號中其中乙個1個,符號之後只能是純數字;

3:字元中第乙個不重複的字元

首先遍歷一次字串,對每乙個字元,map.get(ch),如果無物件返回的話說明ch第一次出現,則插入map,令值為1;如果有返回,則說明重複了,更新其值為-1;

然後在第二次遍歷字串時,讀到都乙個value=-1的就是第乙個不重複的字元了。

4:找到鍊錶中環的入口結點

鍊錶有環是指:尾結點的next指標指向了鍊錶中的某乙個結點形成了環。比如:1-2-3-4-5->3(5是尾結點,指向了3)

我們假設兩個指標p1,p2遍歷這個鍊錶,p2比p1多遍歷了一圈環後到達尾結點。則p2的遍歷路程為:1-2-3-4-5-3-4-5  而p1遍歷到尾結點:1-2-3-4-5,可以發現p2比p1多走了環的結點數步才到達尾結點。那麼p2與p1的步數差剛好為環結點數,那麼如果我們令p2先走環結點數步,然後p1在開始移動,之後p1、p2同時移動,當p1指向環的入口時,p2比p1多環結點數步,所以p2剛好走完了一次環,回到環入口,所以此時p1==p2。那麼我們就找到了環的入口。

5:刪除有序鍊錶中重複的結點:1-2-2-3變成1-3

我們用pre記錄當前結點,然後遍歷乙個結點pnext與pnext->next,如果相同,則令pnext=pnext->next跳過重複結點,迴圈此步,直到pnext!=pnext->next;那麼期間的就是重複的結點,我們令pre->next=pnext->next即可把重複結點從鍊錶中剔除;注意:頭結點就開始重複的,找到第乙個跟頭結點不等的並且不重複的結點設為head即可刪除開始就重複的結點。

解法2:按照中序遍歷規律來找:

如果所給結點有右子樹,說明它是根結點,那麼根據中序遍歷「左根右」的順序,它的右子樹的最左子節點就是下乙個結點,我們只需從右子結點一路左子節點直到找到最左子節點即可;

如果所給結點沒有右子樹,並且它是父節點的左兒子,那麼下乙個遍歷的就是它的父節點;

如果所給結點既沒有右子樹,又不是父節點的左兒子,那麼它的下乙個遍歷結點就是  第乙個作為左兒子的祖先結點的父節點:我們從當前結點回溯父節點,並判斷當前父節點是不是乙個左兒子,不是的話繼續上溯;直到當前祖先結點是其父的乙個左兒子,那麼該祖先結點的父節點就是下乙個要遍歷的結點;如果祖先結點到達樹的根了,則說明所給結點是樹的最右子節點,是中序遍歷的最後遍歷的那個結點。

7:判斷一顆二叉樹是否對稱

解法一:對稱的二叉樹,其左右子樹都是一樣的。既然左右子樹一樣,那麼我們根據 根左右 順序遍歷與  根右左  順序遍歷得到的序列應該是一樣的。那麼我們就可以定義乙個 根左右 的遍歷函式,乙個 根右左 的遍歷函式,得出兩個序列一一進行比較即可。注意:這裡有個特殊情況,各個結點的值一樣,但是左右子樹不對稱,所以我們需要把子結點為null也作為乙個值進行輸出,作為遍歷的序列的乙個元素。

解法二:遞迴法,只要找到有一層地方不對稱即可:

boolean

issame(mytreenode left,mytreenode right)

//當前層判斷出不相等的就說明樹是不對稱的

if((left==null&&right!=null)||(left!=null&&right==null

))

if(left.val!=right.val)

//否則,需要從下一層去判斷

return issame(left.leftnode, right.rightnode)&&issame(left.rightnode, right.leftnode);

}

8:之 字形列印二叉樹

這種倒轉順序的情況,我們第一時間就想到——棧。因此列印每一層時,我們把位於下一層的子節點入棧;

9:序列化二叉樹和反序列化二叉樹

序列化二叉樹是指:按前/中/後順序遍歷二叉樹時,遇到null就用乙個符號表示,比如 $ 符號。

void

serialize(mytreenode root)

system.out.println(root.val+',');

serialize(root.leftnode);

serialize(root.rightnode);

}

反序列化二叉樹是指:給定乙個二叉樹的序列化表示以及遍歷規則,重構出一棵二叉樹。

10:bst中第k大的結點

bst的中序遍歷是乙個增序的陣列,該陣列第k個元素就是bst中第k大結點。

11:求滑動窗內的最大值

給定乙個陣列,以k大小的滑動窗來遍歷元素,求每個窗的最大值。

第乙個窗包含了0~k-1下標的元素,之後視窗逐漸移動,可知總共移動了length-k步。

那麼我們就可以這樣做了:用乙個陣列存放元素,用兩個間隔為k-1的下標維持乙個乙個大小為k的視窗:index1~index2剛好包含了k個元素。每次遍歷index1~index2找到當前視窗最大值,然後index1++,index2++移動視窗。

演算法題摘錄三

1 判斷給定陣列是不是二叉搜尋樹的前 後序遍歷序列 二叉搜尋樹的特點是 左子樹的值 根結點值 右子樹的值。而前 後序遍歷序列的首 尾數是根結點,依據根結點可以把陣列其餘部分劃分為左子樹 右子樹,然後根據左右子樹序列又可以遞迴地確定父結點並劃分子樹.如果能遞迴遍歷完整個陣列則說明合法,否則非法。下面是...

《六頂思考帽》摘錄(3)

六頂思考帽 摘錄 3 第五部分 黃帽思路 第27章 黃色帽子 推測的和肯定的 從態度上講,黃帽子和黑帽子正好相反。黑帽子和否定評價有關,而黃帽子則是從肯定方面看問題。第28章 黃帽思路 肯定的範圍 第29章 黃帽思路 原因和邏輯根據 黃帽思路包括了肯定性的判斷。黃帽思考者應該盡最大可能去尋求支援其樂...

LeetCode演算法題(六) 有效的括號

描述 給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 false 示例 5 輸...