原创 兩數之和-I

問題:給定一個整型數組,是否能找出其中的兩個數使其合爲某個指定 的值? 思路:排序後,從數組兩端向中間移動,一次移動一端的指針,直至兩數合爲爲指定值。 java實現: boolean hasSum(int[] A,int ta

原创 兩數之和-II

問題:給定一個整型數組,找出其中的兩個數使其和爲某個指定的值,並返回這兩個數的下標。假設數組元素的值各不相同,則要求時間複雜度爲O(n), n爲數組的長度。 思路:掃描一遍數組,把鍵值<value, index>存入哈希表,再次掃

原创 首個正數

問題: 給定一個無序整型數組,找出第一個不再數組裏的正整數。要求時間複雜度O(n),空間複雜度爲O(1)。 思路: 將數組轉變成哈希表,將等於i的值放在下標爲i-1處。最後遍歷數組,i處的值若不爲i+1,則輸出整數i+1。 jav

原创 縱橫字謎的答案(Crossword Answers,UVa232)

Sample Input 2 2 AT O 6 7 AIMDEN MEONE UPONTO SOERIN SAOR* IES*DEA 0 Sample Output puzzle #1: Across 1.AT 3.O Down

原创 最小公共祖先 IV

題目: 給定兩個節點,求它們在一個普通樹中的最小公共祖先。 思路: 採用廣度優先遍歷找到節點,將所有節點父節點存入哈希表,當找到節點時回溯哈希表實現到樹根的路徑。找兩條路徑的交點。 java代碼: class TreeNode{

原创 產生括號

問題: 打印出所有N對合理的括號組合。 思路: 用遞歸函數生成括號組合,參數爲左右括號餘量和當前位置,以及已生成的組合。結束條件爲餘量爲0,否則餘量減一繼續調用。 java代碼: public void printPar(int

原创 LRU緩存機制

問題: 運用你所掌握的數據結構,設計和實現一個 LRU (最近最少使用) 緩存機制。它應該支持以下操作: 獲取數據 get 和 寫入數據 put 。 獲取數據 get(key) - 如果密鑰 (key) 存在於緩存中,則獲取密鑰

原创 字符串相乘(大數相乘)

問題: 給出兩個字符串表示的正整數,求其乘積,返回其乘積的字符串表示。 思路: 用一個數組存儲乘積,第i位與第j位的乘積累積保存到數組的第i+j+1位,後對數組每一位做進位操作。 java代碼: public String mul

原创 最小公共祖先 III

問題: 給定兩個子節點,求在二叉樹中的最小公共祖先。 思路: 最小公共祖先有兩種情況:1)兩個節點爲祖子關係;2)兩個節點分別在最小公共祖先兩側;考慮這樣一種遍歷方式,先處理當前節點,若爲兩節點之一則返回,然後分別遞歸調用處理左

原创 平衡二叉樹

問題: 給出一棵二叉樹,判斷其是否爲平衡二叉樹。 思路: 首先,平衡二叉樹的定義:平衡二叉樹要麼是一棵空樹,要麼是具有以下性質的二叉樹–它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的高度之差的絕對值不超過1。 遞歸處理左右子

原创 最小公共祖先 I

問題: 給定個兩個節點,求它們在一棵二叉搜索樹中的最小公共祖先。 思路: 從根節點開始,找到第一個值在兩節點之間的節點,即爲最小公共祖先。 java代碼: TreeNode LCA(TreeNode root,TreeNode p

原创 圖書管理系統(Borrowers,UVa230)

題目鏈接: 圖書管理系統(UVa230) C++代碼: #include <string> #include <set> #include <iostream> #include <cassert> #include <vecto

原创 IP網絡(IP Networks,UVa1590)

Sample Input 3 194.85.160.177 194.85.160.183 194.85.160.178 Sample Output 194.85.160.176 255.255.255.248 C++代碼: #in

原创 循環小數(Repeating Decimals,UVa202)

Sample Input 76 25 5 43 1 397 Sample Output 76/25 = 3.04(0) 1 = number of digits in repeating cycle 5/43 = 0.(11627

原创 打印隊列(Printer Queue,UVa12100)

題目鏈接: 打印隊列(UVa12100) C++代碼: #include<queue> #include <cstdio> #include <cassert> using namespace std; int readint(