劍指offer題目java實現
Problem2:實現Singleton模式
題目描述:設計一個類,我們只能生成該類的一個例項
1 package Problem2; 2 3 public class SingletonClass { 4 5 /* 6 * 題目描述:設計一個類,我們只能生成該類的一個例項 7 */ 8 //volatile:防止指令重排序 9 private static volatile SingletonClass instance; 10 11 private SingletonClass() { 12 } 13 14public static SingletonClass getInstace() { 15 if (instance == null) { 16 synchronized (SingletonClass.class) { 17 if (instance == null) { 18 instance = new SingletonClass(); 19 } 20 } 21 } 22 23 returninstance; 24 25 } 26 27 }
Problem3:二維陣列中的查詢
題目描述:在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下的順序排序。 完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否包含該整數;
1 package Problem3; 2 3 public class Find { 4 5 /* 6 * 題目描述:二維陣列中的查詢 7 * 在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下的順序排序。 8 * 完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否包含該整數9 * 10 */ 11 public static boolean find(int arr[][],int keyNumber){ 12 //從二維陣列的右上角開始選取與keyNumber比較的整數 13 //column的變化:arr[0].length-1-->0; 14 //row的變化:0-->arr.length; 15 int column=arr[0].length-1; 16 int row=0; 17 while(column>=0&&row<arr.length){ 18 if(arr[row][column]==keyNumber){ 19 return true; 20 } 21 else if(arr[row][column]>keyNumber){ 22 column--; 23 } 24 else { 25 row++; 26 } 27 } 28 return false; 29 30 } 31 //測試find函式 32 public static void main(String[] args) { 33 /* 34 * 1 2 8 9 35 * 2 4 9 12 36 * 4 7 10 13 37 * 6 8 11 15 38 */ 39 int array[][]=new int[4][4]; 40 array[0][0]=1; 41 array[0][1]=2; 42 array[0][2]=8; 43 array[0][3]=9; 44 array[1][0]=2; 45 array[1][1]=4; 46 array[1][2]=9; 47 array[1][3]=12; 48 array[2][0]=4; 49 array[2][1]=7; 50 array[2][2]=10; 51 array[2][3]=13; 52 array[3][0]=6; 53 array[3][1]=8; 54 array[3][2]=11; 55 array[3][3]=15; 56 System.out.println(find(array, 7)); 57 System.out.println(find(array, 5)); 58 } 59 60 }
同理,比較關鍵字也可以從二維陣列的左下角開始選擇,則column和row的增減方式調換一下,但是不能選擇左上角和右下角的元素作為與查詢元素比較的關鍵字,因為無論比較結果怎樣,都無法進一步縮小查詢的範圍。
Problem4:替換空格
題目描述:請實現一個函式,將字串的每個空格替換為"%20"。例如輸入"We are happy",則輸出"We%20are%20happy."。
1 package Problem4; 2 3 public class ReplaceBank { 4 5 /* 6 * 題目描述: 請實現一個函式,將字串的每個空格替換為"%20"。 7 * 例如輸入"We are happy",則輸出"We%20are%20happy."。 8 */ 9 /** 10 * @param args 11 */ 12 13 public String replace(String input) { 14 StringBuilder builder = new StringBuilder(); 15 if (input == null || input.length() == 0) { 16 return null; 17 } 18 for (int i = 0; i < input.length(); i++) { 19 if (input.charAt(i) == ' ') { 20 builder.append("%"); 21 builder.append("2"); 22 builder.append("0"); 23 } else { 24 builder.append(input.charAt(i)); 25 } 26 } 27 return builder.toString(); 28 } 29 30 // 測試用例 31 public static void main(String[] args) { 32 ReplaceBank test = new ReplaceBank(); 33 // 輸入的字串包含空格:最後面,最前面,中間,連續空格 34 String str1 = "We are happy."; 35 String str2 = " Wearehappy."; 36 String str3 = "Wearehappy. "; 37 String str4 = "We are happy ."; 38 //輸入的字串沒有空格 39 String str5="Wearehappy."; 40 //特殊輸入測試:字串只有連續空格、只有一個空格、字串是一個null指標、字串是一個空字串; 41 String str6=" "; 42 String str7=" "; 43 String str8=null; 44 String str9=""; 45 System.out.println(test.replace(str1)); 46 System.out.println(test.replace(str2)); 47 System.out.println(test.replace(str3)); 48 System.out.println(test.replace(str4)); 49 System.out.println(test.replace(str5)); 50 System.out.println(test.replace(str6)); 51 System.out.println(test.replace(str7)); 52 System.out.println(test.replace(str8)); 53 System.out.println(test.replace(str9)); 54 } 55 56 }
Problem5:從尾到頭列印連結串列
題目描述:輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值.
1 package Problem5; 2 3 import java.util.Stack; 4 5 //首先定義連結串列結構 6 class LinkNode{ 7 LinkNode next; 8 int node_value; 9 } 10 11 public class PrintListReverse { 12 public void reverse(LinkNode headNode){ 13 //用棧的思想來實現連結串列的倒序輸出 14 Stack<LinkNode> stack=new Stack<LinkNode>(); 15 while(headNode!=null){ 16 stack.push(headNode); 17 headNode=headNode.next; 18 } 19 while(!stack.isEmpty()){ 20 System.out.print(stack.pop().node_value+" "); 21 } 22 System.out.println(); 23 } 24 25 /** 26 * @param args 27 */ 28 public static void main(String[] args) { 29 //輸入的連結串列有多個結點 30 PrintListReverse plr=new PrintListReverse(); 31 LinkNode node1=new LinkNode(); 32 LinkNode node2=new LinkNode(); 33 LinkNode node3=new LinkNode(); 34 node1.node_value=1; 35 node2.node_value=2; 36 node3.node_value=3; 37 node1.next=node2; 38 node2.next=node3; 39 plr.reverse(node1); 40 } 41 42 }
Problem5:重建二叉樹
題目描述:輸入某二叉樹的前序遍歷和中序遍歷結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不包含重複的數字。例如輸入前序遍歷序列:{1,2,4,7,3,5,6,8}和中序遍歷{4,7,2,1,5,3,8,6},則重建出圖中所示二叉樹並且輸出它的頭結點。
重建的二叉樹:
1 package Problem6; 2 3 /* 重建二叉樹 4 * 問題描述:輸入某二叉樹的前序遍歷和中序遍歷結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中 5 * 都不包含重複的數字。例如輸入前序遍歷序列:{1,2,4,7,3,5,6,8}和中序遍歷{4,7,2,1,5,3,8,6}, 6 * 則重建出圖中所示二叉樹並且輸出它的頭結點。 7 */ 8 //定義二叉樹節點 9 class BinaryTreeNode { 10 public int value; 11 public BinaryTreeNode leftNode; 12 public BinaryTreeNode rightNode; 13 14 // 無參建構函式 15 public BinaryTreeNode() { 16 17 } 18 19 // 有參建構函式 20 public BinaryTreeNode(int value) { 21 this.value = value; 22 this.leftNode = null; 23 this.rightNode = null; 24 } 25 } 26 27 public class ConstructBinaryTree { 28 29 public static BinaryTreeNode construct(int preOrder[], int inOrder[], 30 int length) throws Exception { 31 if (preOrder == null || inOrder == null || length < 0) { 32 return null; 33 } 34 return constructCore(preOrder, 0, preOrder.length - 1, inOrder, 0, 35 inOrder.length - 1); 36 } 37 38 public static BinaryTreeNode constructCore(int preOrder[], 39 int startPreIndex, int endPreIndex, int inOrder[], 40 int startInIndex, int endInIndex) throws InvalidPutException { 41 // 頭結點的值 42 int rootValue = preOrder[startInIndex]; 43 44 // 構建一個只有一個根節點的二叉樹 45 BinaryTreeNode root = new BinaryTreeNode(rootValue); 46 // 只有一個元素的情況下: 47 if (startPreIndex == endPreIndex) { 48 if (startInIndex == endInIndex 49 && preOrder[startInIndex] == inOrder[endInIndex]) { 50 System.out.println("只有一個元素"); 51 return root; 52 } else { 53 throw new InvalidPutException(); 54 } 55 56 } 57 // 最重要的一步:在中序遍歷中找到根結點的索引 58 int rootInIndex = startInIndex; 59 while (rootInIndex <= endInIndex && inOrder[rootInIndex] != rootValue) { 60 rootInIndex++; 61 } 62 if (rootInIndex == endInIndex && inOrder[rootInIndex] != rootInIndex) { 63 throw new InvalidPutException(); 64 } 65 //相關推薦
劍指offer題目java實現
Problem2:實現Singleton模式 題目描述:設計一個類,我們只能生成該類的一個例項 1 package Problem2; 2 3 public class SingletonClass { 4 5 /* 6 * 題目描述:設計一個類,我們只能生成
【Java】 劍指offer(33) 二叉搜尋樹的後序遍歷序列 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。 思路 二叉
【Java】 劍指offer(39) 陣列中出現次數超過一半的數字 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1, 2, 3, 2, 2, 2, 5, 4, 2}。由於數字2在陣列中出現
【Java】 劍指offer(30) 包含min函式的棧 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 定義棧的資料結構,請在該型別中實現一個能夠得到棧的最小元素的min函式。在該棧中,呼叫min、push及pop的時間複雜度都是O(1)。 思路 最初想法是定義
【Java】 劍指offer(40) 最小的k個數 《劍指Offer》Java實現合集 劍指offer(39) 陣列中出現次數超過一半的數字 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 輸入n個整數,找出其中最小的k個數。例如輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。 思路 思路一:同劍指offer(39
【Java】 劍指offer(43) 從1到n整數中1出現的次數 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 輸入一個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。 思路
【Java】 劍指offer(44) 連續子陣列的最大和 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 數字以0123456789101112131415…的格式序列化到一個字元序列中。在這個序列中,第5位(從0開始計數)是5,第13位是1,第19位是4,等等。請寫一個
【Java】 劍指offer(46) 把數字翻譯成字串 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 給定一個數字,我們按照如下規則把它翻譯為字串:0翻譯成"a",1翻譯成"b",……,11翻譯成"l",……,25翻譯成"z"。一個數字可能有多個翻譯。例如12258有
【Java】 劍指offer(48) 最長不含重複字元的子字串 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 請從字串中找出一個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含從'a'到'z'的字元。 思路 動態規劃法:定義函式f(i)為:以第i
【Java】 劍指offer(50-2) 字元流中第一個只出現一次的字元 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是'g'。當從該字元流中讀出前六個字元"go
【Java】 劍指offer(53-2) 0到n-1中缺失的數字 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0到n-1之內。在範圍0到n-1的n個數字中有且只有一個數字不在該陣列中,請找
【Java】 劍指offer(53-3) 陣列中數值和下標相等的元素 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 假設一個單調遞增的數組裡的每個元素都是整數並且是唯一的。請程式設計實現一個函式找出陣列中任意一個數值等於其下標的元素。例如,在陣列{-3, -1,1,
【Java】 劍指offer(55-1) 二叉樹的深度 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 輸入一棵二叉樹的根結點,求該樹的深度。從根結點到葉結點依次經過的/結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 思路 簡潔理
【Java】 劍指offer(56-2) 陣列中唯一隻出現一次的數字 《劍指Offer》Java實現合集 56-1) 陣列中只出現一次的兩個數字 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 在一個數組中除了一個數字只出現一次之外,其他數字都出現了三次。請找出那個只出現一次的數字。 思路 這道題中數字出現了三次,無法像56-1) 陣列
【Java】 劍指offer(59-2) 佇列的最大值 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 請定義一個佇列並實現函式max得到佇列裡的最大值,要求函式max、push_back和pop_front的時間複雜度都是O(1)。 思路 與滑動
【Java】 劍指offer(64) 求1+2+…+n 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。 思路
【Java】 劍指offer(66) 構建乘積陣列 《劍指Offer》Java實現合集 構建乘積陣列 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 給定一個數組A[0, 1, …, n-1],請構建一個數組B[0, 1, …, n-1],其中B中的元素B[i] =A[0]×A[1]×… ×A[i-1
【Java】 劍指offer(68) 樹中兩個結點的最低公共祖先 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 輸入兩個樹結點,求它們的最低公共祖先。 思路 該題首先要和麵試官確定是否為二叉樹,得到肯定答覆後,還要確定是否為二叉搜尋樹,是否有父指標,或者僅
【劍指offer】Java實現-二叉搜尋樹的第k個結點
題目描述 給定一棵二叉搜尋樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值為4。 思路 二叉搜尋樹-BST(又二叉查詢樹,二叉排
【劍指offer】Java實現-序列化與反序列化二叉樹
題目描述 實現兩個函式,分別用來序列化和反序列化二叉樹 思路 序列化:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中簡歷起來的二叉樹可以持久儲存 反序列化:根據某